| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 | 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();            }        }    }}
 |