在UGUI中遇到的其它类,统一放在一起了。主要包括CoroutineTween
、IndexedSet
、ListPool
、ReflectionMethodsCache
和SetPropertyUtility
等。
CoroutineTween
用于实现一些逐帧变化的数值或动画。之前一直用DOTween插件做动画,推测其背后是相似的原理。CoroutineTween.cs
包含了1个接口,2个实现了该接口的struct和1个类:
1 | namespace UnityEngine.UI.CoroutineTween |
接下来逐个学习:
ITweenValue
可以用来“Tween”的值,可以是一个浮点数、一个颜色等。它包含了一个方法:1
void TweenValue(float floatPercentage);
是实现渐变的最核心的函数。
TweenRunner
TweenRunner
用于驱动一个Tween,借助于协程来实现每帧的更新,以下是其包含的Start
方法:
1 | private static IEnumerator Start(T tweenInfo) |
ITweenValue
和TweenRunner
组成了最近本的框架。
ColorTween
ColorTween
是颜色渐变动画类,其实现了TweenValue
方法如下:
1 | public void TweenValue(float floatPercentage) |
以下是在Graphic
中使用ColorTween
完成颜色渐变的相关代码:
1 | protected Graphic() |
1 | public virtual void CrossFadeColor(Color targetColor, float duration, bool ignoreTimeScale, bool useAlpha, bool useRGB) |
FloatTween
与ColorTween
原理相似,FloatTween
用来在每帧改变的是浮点数的值,不再赘述。
IndexedSet
一个数据容器,内部维护的是一个数据的List和一个以数据为键以索引顺序为值的字典。主要特点是数据唯一,且按顺序存储。支持的接口有快速随机移除,快速在尾部添加不重复的数据项,顺序访问等。
ListPool
ListPool
是各种List的对象池,其基于ObjectPool<T>
实现:
1 | internal class ObjectPool<T> where T : new() |
1 | internal static class ListPool<T> |
其中ObjectPool<T>
内部使用一个Stack来保存对象并计数,以实现对象复用:
1 | public T Get() |
ReflectionMethodsCache
使用反射的方法获取函数,降低模块间的依赖程度。如当调用Physics.Raycast(...)
方法时,其中包含这样的代码:
1 | internal class ReflectionMethodsCache |
在GraphicRaycaster
中可以看到其使用方法如下:
1 | if (ReflectionMethodsCache.Singleton.raycast3D != null) |
SetPropertyUtility
一个工具类,当调用set方法(set属性)时,判断二者是否相等,如果不相等则替换为新的值,最后返回bool值表示是否替换了旧的值,如在设置颜色时:
1 | public static bool SetColor(ref Color currentValue, Color newValue) |
在Graphic
有调用如下:
1 | public virtual Color color |
本系列其它文章详见Unity3D UGUI 源码学习