192 lines
5.8 KiB
C#
192 lines
5.8 KiB
C#
|
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();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|