开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:1876

当前位置:游戏蛮牛 技术专区 开发者专栏

__________________________________________________________________________________
开发者干货区版块规则:

  1、文章必须是图文形式。(至少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
__________________________________________________________________________________
查看: 1221|回复: 14

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

[复制链接]  [移动端链接]
排名
1304
昨日变化

34

主题

105

帖子

1798

积分

Rank: 9Rank: 9Rank: 9

UID
35368
好友
19
蛮牛币
4647
威望
0
注册时间
2014-7-20
在线时间
675 小时
最后登录
2017-9-25

专栏作家活力之星

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






回复

使用道具 举报

6蛮牛粉丝
1063/1500
排名
2072
昨日变化
1

0

主题

275

帖子

1063

积分

Rank: 6Rank: 6Rank: 6

UID
89942
好友
1
蛮牛币
562
威望
0
注册时间
2015-4-7
在线时间
263 小时
最后登录
2017-9-18
发表于 2016-12-8 18:00:01 | 显示全部楼层
谢谢楼主分享

回复

使用道具 举报

排名
1423
昨日变化
1

58

主题

317

帖子

2200

积分

Rank: 9Rank: 9Rank: 9

UID
35466
好友
19
蛮牛币
3600
威望
0
注册时间
2014-7-21
在线时间
737 小时
最后登录
2017-9-25

专栏作家

发表于 2016-12-8 18:05:56 | 显示全部楼层
有没有最新版本 ,应该是免费的

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1244/1500
排名
5130
昨日变化

2

主题

775

帖子

1244

积分

Rank: 6Rank: 6Rank: 6

UID
92518
好友
1
蛮牛币
2464
威望
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
排名
7098
昨日变化
3

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

回复

使用道具 举报

排名
24979
昨日变化
7

0

主题

8

帖子

19

积分

Rank: 1

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

回复

使用道具 举报

7日久生情
2820/5000
排名
1770
昨日变化
7

3

主题

1733

帖子

2820

积分

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

UID
182740
好友
0
蛮牛币
4322
威望
0
注册时间
2016-11-10
在线时间
488 小时
最后登录
2017-9-25

迈向小康

发表于 2016-12-11 10:12:56 | 显示全部楼层
谢谢楼主分享谢谢楼主分享
[发帖际遇]: yhr28 发帖时在路边捡到 1 蛮牛币,偷偷放进了口袋. 幸运榜 / 衰神榜

回复 支持 反对

使用道具 举报

4四处流浪
419/500
排名
6860
昨日变化

0

主题

73

帖子

419

积分

Rank: 4

UID
115241
好友
2
蛮牛币
136
威望
0
注册时间
2015-7-26
在线时间
208 小时
最后登录
2017-7-31
发表于 2016-12-13 18:44:46 | 显示全部楼层
楼主能不能出一个dotween和itween的对比,听说dotween效率更高,但是不知道为什么

回复 支持 反对

使用道具 举报

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

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偶尔光临
212/300
排名
9347
昨日变化
2

0

主题

54

帖子

212

积分

Rank: 3Rank: 3Rank: 3

UID
116282
好友
0
蛮牛币
384
威望
0
注册时间
2015-8-2
在线时间
74 小时
最后登录
2017-7-21
发表于 2016-12-15 09:15:28 | 显示全部楼层
我也想了解doTween

回复 支持 反对

使用道具 举报

排名
27761
昨日变化
10

0

主题

20

帖子

39

积分

Rank: 1

UID
149158
好友
0
蛮牛币
120
威望
0
注册时间
2016-5-19
在线时间
11 小时
最后登录
2017-1-14
发表于 2016-12-28 09:38:30 | 显示全部楼层

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

回复 支持 反对

使用道具 举报

4四处流浪
428/500
排名
7499
昨日变化
3

1

主题

166

帖子

428

积分

Rank: 4

UID
116097
好友
0
蛮牛币
309
威望
0
注册时间
2015-7-31
在线时间
139 小时
最后登录
2017-9-25
发表于 2017-1-2 20:20:37 | 显示全部楼层
{:90:}6666666666666666666666
[发帖际遇]: qqyao 捡了钱没交公 蛮牛币 降了 1 . 幸运榜 / 衰神榜

回复 支持 反对

使用道具 举报

4四处流浪
312/500
排名
6188
昨日变化
3

0

主题

64

帖子

312

积分

Rank: 4

UID
153443
好友
0
蛮牛币
668
威望
0
注册时间
2016-6-24
在线时间
88 小时
最后登录
2017-9-13
发表于 2017-2-21 20:55:13 | 显示全部楼层
谢谢楼主分享!
[发帖际遇]: 一个袋子砸在了 monk_half 头上,monk_half 赚了 1 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

5熟悉之中
509/1000
排名
3692
昨日变化
20

0

主题

83

帖子

509

积分

Rank: 5Rank: 5

UID
210517
好友
0
蛮牛币
1801
威望
0
注册时间
2017-3-7
在线时间
122 小时
最后登录
2017-9-25
发表于 2017-5-11 09:56:42 | 显示全部楼层

谢谢楼主分享!

回复

使用道具 举报

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

本版积分规则

快速回复 返回顶部 返回列表