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