You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
180 lines
5.4 KiB
180 lines
5.4 KiB
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>(); |
|
} |
|
} |
|
|
|
class TweenEngine : MonoBehaviour |
|
{ |
|
void Update() |
|
{ |
|
TweenManager.Update(); |
|
} |
|
} |
|
} |
|
}
|
|
|