首页 > 其他 > 详细

NGUI 动画系统:UITweener

时间:2020-08-15 17:29:29      阅读:69      评论:0      收藏:0      [点我收藏+]
目录:?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:透明度动画。
  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更新自己的状态。

NGUI 动画系统:UITweener

原文:https://www.cnblogs.com/wang-jin-fu/p/13509114.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!