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