找回密码
 注册帐号

扫一扫,访问微社区

哪来的胖子 看清iTween--核心代码讲解

17
回复
3693
查看
[ 复制链接 ]
排名
775
昨日变化

34

主题

139

帖子

2643

积分

Rank: 9Rank: 9Rank: 9

UID
35368
好友
20
蛮牛币
1718
威望
0
注册时间
2014-7-20
在线时间
988 小时
最后登录
2020-7-7

专栏作家活力之星

QQ
2016-12-8 16:35:59 显示全部楼层 阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
本帖最后由 哪来的胖子 于 2016-12-8 16:35 编辑

内容说明:
    1. iTween的生命周期
    2.iTween的内部处理流程
    3.iTween的核心属性

    4.iTween的对外方法


    其实每个游戏都会使用缓动功能来做动画,我们今天来说下unity的一个缓动插件iTween的原理,让我们从内而外的来看清iTween在干什么。

1. iTween的生命周期
    我们可看下iTween的源代码,可以很清晰的看见iTween继承自MonoBehaviour。那我就可以看下在常规的声明周期中iTween做了什么。

    我先把代码放在下面:

[C#] 纯文本查看 复制代码
void Awake(){
                RetrieveArgs();
         lastRealTime = Time.realtimeSinceStartup; // Added by PressPlay
        }
        
        IEnumerator Start(){
                if(delay > 0){
                        yield return StartCoroutine("TweenDelay");
                }
                TweenStart();
        }        
        
        //non-physics
        void Update(){
                if(isRunning && !physics){
                        if(!reverse){
                                if(percentage<1f){
                                        TweenUpdate();
                                }else{
                                        TweenComplete();        
                                }
                        }else{
                                if(percentage>0){
                                        TweenUpdate();
                                }else{
                                        TweenComplete();        
                                }
                        }
                }
        }
        
        //physics
        void FixedUpdate(){
                if(isRunning && physics){
                        if(!reverse){
                                if(percentage<1f){
                                        TweenUpdate();
                                }else{
                                        TweenComplete();        
                                }
                        }else{
                                if(percentage>0){
                                        TweenUpdate();
                                }else{
                                        TweenComplete();        
                                }
                        }
                }        
        }

        void LateUpdate(){
                //look applications:
                if(tweenArguments.Contains("looktarget") && isRunning){
                        if(type =="move" || type =="shake" || type=="punch"){
                                LookUpdate(gameObject,tweenArguments);
                        }                        
                }
        }
        
        void OnEnable(){
                if(isRunning){
                        EnableKinematic();
                }
        
                //resume delay:
                if(isPaused){
                        isPaused=false;
                        if(delay > 0){
                                wasPaused=true;
                                ResumeDelay();
                        }
                }
        }

        void OnDisable(){
                DisableKinematic();
        }


   在Awake很简单就是初始化。Start实现了延迟的功能,开启tween的循环。Update和FixedUpdate核心处理,完成tween的数值更新。LateUpdate实现的就是lookAt的功能。OnEnable和OnDisable 可用和不可用时的处理。那么像清晰的看清iTween在干什么,我们看update就可以了,其实也很简单就是调用TweenUpdate()就可以了。这就是iTween的核心处理函数。到这里就不在深入了,我们从其它方面深入讲解。


2.iTween的调用流程
    iTween继承自MonoBehaviour,那么必然要添加到GameObject上面才能走生命周期。那么我就查看什么时候开始添加的。

说明01.jpg

前面两步应该都可以明白,主要是itween的运行步骤我们再来说下。



方法名
功能
IEnumerator TweenDelay()
延迟功能,在tween的Start中调用,完成后调用TweenStart
void TweenStart()
开始Tween的执行,调用”onstart”的回调,isRunning=true
IEnumerator TweenRestart()
在TweenLoop()中调用,完成循环设置
void TweenUpdate()
更新tween的数值
void TweenComplete()
Tween完成是调用,调用oncomplete回调
void TweenLoop()
如果loopType为LoopType.loop或者LoopType.pingPong会在完成函数中调用。
说明02.jpg

这就是itween的基本流程。

3.iTween的核心属性
    可以看出itween的循环很简单,思路也很清晰,那是什么让他玩出了那么对的花样呢?就是几个属性,让iTween不一样了。
属性
作用
ApplyTween apply
循环执行函数,itween的核心实现
EasingFunction ease
缓动函数由iTween.EaseType easeTyp来确定
Hashtable tweenArguments
各种参数的保存
string type
当前运动的类型
String method
类型下的方法,type+method确定apply
ApplyTween 和 EasingFunction说明:(直接上代码说下,就是这么直接)
[C#] 纯文本查看 复制代码
private delegate float EasingFunction(float start, float end, float value);
private delegate void ApplyTween();




我们来看下流程:
   Type + method确定apply -------> apply计算进度然后调用ease计算下面需要的值----->然后进行赋值。
   Apply和 ease 在iTween里面都已经写好了,如果你感觉功能不够的话可以自己进行扩展。
   我们现在来细说下缓动函数,其实缓动函数接口很坚定,就是传入一个起始值,一个最终值,然后通过value(0到1)来计算一个当前百分比的值出来。iTween自带的缓动函数都在Easing Curves,可以看下。

线面我们用一个实际的例子来说明整个流程。
[C#] 纯文本查看 复制代码
iTween.MoveTo(gameObject, iTween.Hash("position", targetPosition, "time", 2.0f, "easeType", iTween.EaseType.linear));


<1调用MoveTo,传入target(改变的对象)和相关属性,确定type=move,method = to。
<2调用Launch方法,将数据缓存到tweens静态属性中,添加一个iTween到gameObject
<3 进入itween的生命周期,调用GenerateTargets方案,确定apply要调用的函数
<4 进入TweenUpdate调用,知道完成,调用TweenComplete

4.iTween的对外方法
    我们看下iTween给我提供了哪些方法:
控制音频:AudioFrom、AudioTo、AudioUpdate、Stab
控制相机:CameraFadeAdd、CameraFadeDepth、CameraFadeDestroy、CameraFadeSwap、CameraFadeFrom、CameraFadeTo、CameraTexture
变色控制:ColorFrom、ColorTo、ColorUpdate
绘制相关:DrawLine、DrawLineGizmos、DrawLineHandles、DrawPath、DrawPathGizmos、DrawPathHandles
淡入淡出:FadeFrom、FadeTo、FadeUpdate
视角控制:LookFrom、LookTo、LookUpdate、LookType
移动控制:MoveAdd、MoveBy、MoveFrom、MoveTo、MoveUpdate
路径操作:PutOnPath、PointOnPath
旋转操作:RotateAdd、RotateBy、RotateFrom、RotateTo、RotateUpdate
缩放操作:ScaleAdd、ScaleBy、ScaleFrom、ScaleTo、ScaleUpdate
震动控制:ShakePosition、ShakeRotation、ShakeScale
其他:Count、PathLength、EaseType(衰减类型)、FloatUpdate、Hash、Init、Pause、Resume、Stop、StopByName、PunchPosition、PunchRotation、PunchScale、RectUpdate、ValueTo、Vector2Update、Vector3Update

中文API地址:http://www.unitybeginner.com/itween/


Itween官方demo(比较老的一个版本)下载:http://pan.baidu.com/s/1qXWUock





回复

使用道具 举报

7日久生情
1565/5000
排名
1706
昨日变化

1

主题

296

帖子

1565

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
89942
好友
1
蛮牛币
251
威望
0
注册时间
2015-4-7
在线时间
502 小时
最后登录
2020-8-4
2016-12-8 18:00:01 显示全部楼层
谢谢楼主分享
回复

使用道具 举报

排名
806
昨日变化

68

主题

420

帖子

3365

积分

Rank: 9Rank: 9Rank: 9

UID
35466
好友
28
蛮牛币
5472
威望
0
注册时间
2014-7-21
在线时间
1135 小时
最后登录
2019-11-18

专栏作家

2016-12-8 18:05:56 显示全部楼层
有没有最新版本 ,应该是免费的
回复 支持 反对

使用道具 举报

6蛮牛粉丝
1242/1500
排名
6534
昨日变化

2

主题

767

帖子

1242

积分

Rank: 6Rank: 6Rank: 6

UID
92518
好友
1
蛮牛币
2462
威望
0
注册时间
2015-4-15
在线时间
277 小时
最后登录
2017-4-6
2016-12-8 18:42:40 显示全部楼层
有没有最新版本 ,应该是免费的
回复 支持 反对

使用道具 举报

0

主题

37

帖子

41

积分

Rank: 1

UID
188057
好友
0
蛮牛币
1
威望
0
注册时间
2016-11-29
在线时间
4 小时
最后登录
2016-12-8
2016-12-8 21:50:56 显示全部楼层
566666666666666
回复 支持 反对

使用道具 举报

3偶尔光临
286/300
排名
8916
昨日变化

2

主题

83

帖子

286

积分

Rank: 3Rank: 3Rank: 3

UID
173990
好友
1
蛮牛币
379
威望
0
注册时间
2016-10-8
在线时间
69 小时
最后登录
2017-6-20
2016-12-9 17:17:53 显示全部楼层
dhgsdjaskjdff
回复

使用道具 举报

排名
31435
昨日变化

0

主题

8

帖子

19

积分

Rank: 1

UID
188666
好友
0
蛮牛币
9
威望
0
注册时间
2016-12-1
在线时间
3 小时
最后登录
2016-12-11
QQ
2016-12-10 18:26:16 显示全部楼层
那点蛮牛币!!
回复

使用道具 举报

8常驻蛮牛
5230/10000
排名
426
昨日变化

4

主题

2464

帖子

5230

积分

Rank: 8Rank: 8

UID
182740
好友
2
蛮牛币
9356
威望
0
注册时间
2016-11-10
在线时间
1136 小时
最后登录
2020-4-3
2016-12-11 10:12:56 显示全部楼层
谢谢楼主分享谢谢楼主分享
回复 支持 反对

使用道具 举报

5熟悉之中
739/1000
排名
7477
昨日变化

0

主题

100

帖子

739

积分

Rank: 5Rank: 5

UID
115241
好友
2
蛮牛币
215
威望
0
注册时间
2015-7-26
在线时间
469 小时
最后登录
2020-9-26
2016-12-13 18:44:46 显示全部楼层
楼主能不能出一个dotween和itween的对比,听说dotween效率更高,但是不知道为什么
回复 支持 反对

使用道具 举报

3偶尔光临
263/300
排名
8418
昨日变化

1

主题

46

帖子

263

积分

Rank: 3Rank: 3Rank: 3

UID
178701
好友
1
蛮牛币
415
威望
0
注册时间
2016-10-27
在线时间
72 小时
最后登录
2017-6-8
2016-12-14 09:23:54 显示全部楼层

谢谢楼主分享
回复

使用道具 举报

3偶尔光临
221/300
排名
11510
昨日变化

0

主题

54

帖子

221

积分

Rank: 3Rank: 3Rank: 3

UID
116282
好友
0
蛮牛币
410
威望
0
注册时间
2015-8-2
在线时间
78 小时
最后登录
2018-10-29
2016-12-15 09:15:28 显示全部楼层
我也想了解doTween
回复 支持 反对

使用道具 举报

排名
31435
昨日变化

0

主题

34

帖子

60

积分

Rank: 2Rank: 2

UID
149158
好友
0
蛮牛币
122
威望
0
注册时间
2016-5-19
在线时间
17 小时
最后登录
2018-5-21
2016-12-28 09:38:30 显示全部楼层

楼主能不能出一个dotween和itween的对比,听说dotween效率更高,但是不知道为什么
回复 支持 反对

使用道具 举报

5熟悉之中
660/1000
排名
6392
昨日变化

1

主题

200

帖子

660

积分

Rank: 5Rank: 5

UID
116097
好友
0
蛮牛币
325
威望
0
注册时间
2015-7-31
在线时间
247 小时
最后登录
2020-8-30
2017-1-2 20:20:37 显示全部楼层
{:90:}6666666666666666666666
回复 支持 反对

使用道具 举报

4四处流浪
449/500
排名
6483
昨日变化

0

主题

75

帖子

449

积分

Rank: 4

UID
153443
好友
0
蛮牛币
640
威望
0
注册时间
2016-6-24
在线时间
166 小时
最后登录
2020-9-22
2017-2-21 20:55:13 显示全部楼层
谢谢楼主分享!
回复

使用道具 举报

7日久生情
1755/5000
排名
1221
昨日变化

0

主题

109

帖子

1755

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
210517
好友
0
蛮牛币
5645
威望
0
注册时间
2017-3-7
在线时间
680 小时
最后登录
2020-9-19
2017-5-11 09:56:42 显示全部楼层

谢谢楼主分享!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

蛮牛教育10.1大促销!全站6折扣!