NGUI 动画系统:UITweener

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:透明度动画。
  1. 重写Begin方法,该方法会调用父类的Begin,并返回一个TweenAlpha。
  1. 重写OnUpdate虚方法,在该方法了对value赋值,value = Mathf.Lerp(from, to, factor)。
  1. 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更新自己的状态。
原文地址:https://www.cnblogs.com/wang-jin-fu/p/13509114.html