Doris232 发表于 2022-11-22 17:20

02 uGUI源码-CoroutineTween.cs

ITweenValue Interface

定义


[*]Base interface for tweeners
Tweener的基本接口。

Code summary: using an interface instead of an abstract class as we want the tweens to be structs.
这里使用接口而不是抽象类的原因是我们希望Tweener是值类型。
成员

void TweenValue(float floatPercentage);//Runner执行方法bool ignoreTimeScale { get; } //时间增量是否受到timeScale影响float duration { get; }//过渡需要的总体时间bool ValidTarget(); //TweenCallback是否不为nullColorTween Struct

定义


[*]Color tween class, receives the TweenValue callback and then sets the value on the target.
颜色渐变类型,接收TweenValue回调,然后设置目标器上的值。(继承ITweenValue)
字段以及属性


[*]ColorTweenMode(enum)
颜色渐变类型(All,RGB,Alpha)。
[*]m_Target(ColorTweenCallback)
每次执行完TweenValue方法后调用的回调。

public class ColorTweenCallback : UnityEvent<Color> {}


[*]m_StartColor/startColor(Color)
起始Color值。
[*]m_TargetColor/targetColor(Color)
目标Color值。
[*]duration & ignoreTimeScale
接口定义的属性。
成员方法

TweenValue


定义
提供给TweenRunner执行的方法。
public void TweenValue(float floatPercentage){      //若回调m_Target为null,则直接返回      if (!ValidTarget()) return;      //Lerp插值函数,floatPercentage为返回比例。      //当floatPercentage为0时返回m_StartColor;      //floatPercentage为1时返回m_TargetColo。      var newColor = Color.Lerp(m_StartColor, m_TargetColor, floatPercentage);      //ColorTweenMode为Alpha值,则RGB保持startColor值      if (m_TweenMode == ColorTweenMode.Alpha){                newColor.r = m_StartColor.r;                newColor.g = m_StartColor.g;                newColor.b = m_StartColor.b;      }      //ColorTweenMode为RGB值,则Alpha保持startColor值      else if (m_TweenMode == ColorTweenMode.RGB){                newColor.a = m_StartColor.a;      }      //调用m_Target回调      m_Target.Invoke(newColor);}AddOnChangedCallback


定义
向m_Target注册回调事件。
public void AddOnChangedCallback(UnityAction<Color> callback);
GetIgnoreTimescale/GetDuration 获取对应属性值。
ValidTarget 确认m_Target是否为null。
FloatTween Struct

与ColorTween实现基本相同。
TweenRunner<T> Class

定义


[*]Tween runner, executes the given tween. The coroutine will live within the given behaviour container.
补间运行器(TweenRunner),执行给定的补间(Tween)。协程将存在于给定的行为容器(Behaviour Container)中。

where T : struct, ITweenValue //T必须是Tween
字段以及属性


[*]m_CoroutineContainer(MonoBehaviour)
协程依附的行为容器。
[*]m_Tween(IEnumerator)
补间协程。
成员方法

Start


定义
将Tweener包装成一个IEnumerator。
private static IEnumerator Start(T tweenInfo){      if (!tweenInfo.ValidTarget())             yield break;//m_Taregt为null,直接中断协程      var elapsedTime = 0.0f;      while (elapsedTime < tweenInfo.duration){             elapsedTime += tweenInfo.ignoreTimeScale ? Time.unscaledDeltaTime : Time.deltaTime;             var percentage = Mathf.Clamp01(elapsedTime / tweenInfo.duration);             //每个deltaTime执行m_Target             tweenInfo.TweenValue(percentage);             yield return null; //等待一帧继续执行      }      //补间完成,最后执行一次      tweenInfo.TweenValue(1.0f);}Init


定义
设置m_CoroutineContainer。
public void Init(MonoBehaviour coroutineContainer);StartTween


定义
开始一个Tweener协程。
public void StartTween(T info);
首先检查 m_CoroutineContainer是否为null,然后停止当前运行的协程;
然后检查 m_CoroutineContainer在GameScene中是否显示,若不显示则不用执行补间,直接执行TweenValue(1.0f):
if (!m_CoroutineContainer.gameObject.activeInHierarchy){      info.TweenValue(1.0f);      return;}
最后检查完毕,创建Tween协程并运行。
StopTween


定义
停止一个Tweener协程。
public void StopTween();
这里停止的协程是当前的m_Tween。
总结

CoroutineTween.cs脚本主要在Graphic类与Dropdown类中使用,负责Color与Alpha值的平滑过渡。
页: [1]
查看完整版本: 02 uGUI源码-CoroutineTween.cs