192 lines
5.8 KiB
C#
Raw Permalink Normal View History

2025-06-07 17:43:34 +08:00
using System.Collections.Generic;
using UnityEngine;
namespace FairyGUI
{
internal static class TweenManager
{
static GTweener[] _activeTweens = new GTweener[30];
static List<GTweener> _tweenerPool = new List<GTweener>(30);
static int _totalActiveTweens = 0;
static bool _inited = false;
internal static GTweener CreateTween()
{
if (!_inited)
Init();
GTweener tweener;
int cnt = _tweenerPool.Count;
if (cnt > 0)
{
tweener = _tweenerPool[cnt - 1];
_tweenerPool.RemoveAt(cnt - 1);
}
else
tweener = new GTweener();
tweener._Init();
_activeTweens[_totalActiveTweens++] = tweener;
if (_totalActiveTweens == _activeTweens.Length)
{
GTweener[] newArray = new GTweener[_activeTweens.Length + Mathf.CeilToInt(_activeTweens.Length * 0.5f)];
_activeTweens.CopyTo(newArray, 0);
_activeTweens = newArray;
}
return tweener;
}
internal static bool IsTweening(object target, TweenPropType propType)
{
if (target == null)
return false;
bool anyType = propType == TweenPropType.None;
for (int i = 0; i < _totalActiveTweens; i++)
{
GTweener tweener = _activeTweens[i];
if (tweener != null && tweener.target == target && !tweener._killed
&& (anyType || tweener._propType == propType))
return true;
}
return false;
}
internal static bool KillTweens(object target, TweenPropType propType, bool completed)
{
if (target == null)
return false;
bool flag = false;
int cnt = _totalActiveTweens;
bool anyType = propType == TweenPropType.None;
for (int i = 0; i < cnt; i++)
{
GTweener tweener = _activeTweens[i];
if (tweener != null && tweener.target == target && !tweener._killed
&& (anyType || tweener._propType == propType))
{
tweener.Kill(completed);
flag = true;
}
}
return flag;
}
internal static GTweener GetTween(object target, TweenPropType propType)
{
if (target == null)
return null;
int cnt = _totalActiveTweens;
bool anyType = propType == TweenPropType.None;
for (int i = 0; i < cnt; i++)
{
GTweener tweener = _activeTweens[i];
if (tweener != null && tweener.target == target && !tweener._killed
&& (anyType || tweener._propType == propType))
{
return tweener;
}
}
return null;
}
internal static void Update()
{
int cnt = _totalActiveTweens;
int freePosStart = -1;
for (int i = 0; i < cnt; i++)
{
GTweener tweener = _activeTweens[i];
if (tweener == null)
{
if (freePosStart == -1)
freePosStart = i;
}
else if (tweener._killed)
{
tweener._Reset();
_tweenerPool.Add(tweener);
_activeTweens[i] = null;
if (freePosStart == -1)
freePosStart = i;
}
else
{
if ((tweener._target is GObject) && ((GObject)tweener._target)._disposed)
tweener._killed = true;
else if (!tweener._paused)
tweener._Update();
if (freePosStart != -1)
{
_activeTweens[freePosStart] = tweener;
_activeTweens[i] = null;
freePosStart++;
}
}
}
if (freePosStart >= 0)
{
if (_totalActiveTweens != cnt) //new tweens added
{
int j = cnt;
cnt = _totalActiveTweens - cnt;
for (int i = 0; i < cnt; i++)
{
_activeTweens[freePosStart++] = _activeTweens[j];
_activeTweens[j] = null;
j++;
}
}
_totalActiveTweens = freePosStart;
}
}
internal static void Clean()
{
_tweenerPool.Clear();
}
static void Init()
{
_inited = true;
if (Application.isPlaying)
{
GameObject gameObject = new GameObject("[FairyGUI.TweenManager]");
gameObject.hideFlags = HideFlags.HideInHierarchy;
gameObject.SetActive(true);
Object.DontDestroyOnLoad(gameObject);
gameObject.AddComponent<TweenEngine>();
}
}
#if UNITY_2019_3_OR_NEWER
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]
static void InitializeOnLoad()
{
_tweenerPool.Clear();
_activeTweens = new GTweener[30];
_totalActiveTweens = 0;
_inited = false;
}
#endif
class TweenEngine : MonoBehaviour
{
void Update()
{
TweenManager.Update();
}
}
}
}