NGUI 动画系统:UITweener
目录:NGUI源码学习
UITweener:动画系统基类,计算动画的进度值,update处理。
基类UITweener属性方法:
UITweener:动画组件基类,通过enabled控制动画的开始结束 Begin-enable-Update-DoUpdate-Sample property: method:轨迹,例如透明度线性变化、递增变化等 style:循环方式,单次不循环、循环(头-尾,头-尾)、PingPong(头-尾,尾-头) animationCurve:渐变轨迹 ignoreTimeScale:游戏暂停时,是否继续播放动画 delay:启动延迟,Play后几秒开始动画 duration:动画持续时间,不包括delay时间 mStarted/mStartTime:动画运行时属性,是否开始、开始事件 mAmountPerDelta:每帧播放进度,1/duration mFactor: mFactor += amountPerDelta * delta,当前动画播放的进度,这边值的正负代表方向 function: DoUpdate:计算factor,然后根据style修正mFactor,计算动画是否结束,调用Sample Sample:针对Method类型修正最终的进度值,通过OnUpdate把factor进度、isFinished通知子类
核心方法OnUpdate:
Sample:最终通过虚函数的OnUpdate通知子类
播放动画
1.PlayForward、PlayReverse、Play成员方法,只修改mAmountPerDelta,会调用到DoUpdate。
2.Begin静态方法,用于给一个GameObject动态挂载动画,如果指定动画类型组件不存在,会动态AddComponent。这边的style默认设置成了不循环Style.Once。
TweenAlpha:透明度动画。
- 重写Begin方法,该方法会调用父类的Begin,并返回一个TweenAlpha。
- 重写OnUpdate虚方法,在该方法了对value赋值,value = Mathf.Lerp(from, to, factor)。
- value赋值。
public float value { set { if (!mCached) Cache(); if (mRect != null) { mRect.alpha = value; } else if (mSr != null) { Color c = mSr.color; c.a = value; mSr.color = c; } else if (mMat != null) { Color c = mMat.color; c.a = value; mMat.color = c; } else if (mLight != null) { mLight.intensity = mBaseIntensity * value; } } }
透明度更新步骤:
1.动画开始播放后,UITweener会在Update里每帧调用DoUpdate。
2.DoUpdate会初步计算当前进度值mFactor和动画状态,在调用Sample根据method值修正mFactor。
3.通过OnUpdate通知子对象根据mFactor更新自己的状态。
一直想把之前工作、学习时记录的文档整理到博客上,一方面温故而知新,一方面和大家一起学习 -程序小白