using System; using System.Collections.Generic; using OfficeOpenXml.FormulaParsing.Excel.Functions.Logical; using UnityEngine; using Utility; using Object = UnityEngine.Object; namespace Core.UI.UTool.UITween { [ExecuteAlways] public class UITweenController : MonoBehaviour { public float maxDuration; public bool isUpdate; [HideInInspector] public float currTime; public List GrpupInfos = new List(); private BetterList _currPlay = new BetterList(); public ParticleSystem.MinMaxGradient MinMaxGradient = new ParticleSystem.MinMaxGradient(); public bool isLoop; private List _uiTweenControllers = new List(); private Map _currPayCacheData = new Map(); private void OnEnable() { if (Application.isPlaying) { StartPlay(false); } } void OnDrawGizmos() { #if UNITY_EDITOR if (!Application.isPlaying) { UnityEditor.EditorApplication.QueuePlayerLoopUpdate(); UnityEditor.SceneView.RepaintAll(); } #endif } public T GetCacheData(TweenBasic tweenBasic) where T : TweenCacheDataBasic, new() { if (_currPayCacheData.TryGetValue(tweenBasic, out TweenCacheDataBasic tweenPlayFxCacheData)) { return tweenPlayFxCacheData as T; } T t = new T(); _currPayCacheData.Add(tweenBasic, t as TweenCacheDataBasic); return t; } public void Play(string animName, bool isChildren) { _uiTweenControllers.Clear(); maxDuration = 0; _currPlay.Clear(); isLoop = false; for (int i = 0; i < GrpupInfos.Count; i++) { TweenAssetGrpupInfo tweenAssetGrpupInfo = GrpupInfos[i]; tweenAssetGrpupInfo.SetMaxTime(); if (tweenAssetGrpupInfo.animName.Equals(animName)) { if (tweenAssetGrpupInfo.maxDuration > maxDuration) { maxDuration = tweenAssetGrpupInfo.maxDuration; } if (tweenAssetGrpupInfo.isLoop) { isLoop = true; } tweenAssetGrpupInfo.StartPlay(this); _currPlay.Add(tweenAssetGrpupInfo); } } if (isChildren) { UITweenController[] uiTweenControllers = gameObject.transform.GetComponentsInChildren(); _uiTweenControllers.AddRange(uiTweenControllers); _uiTweenControllers.Remove(this); for (int i = 0; i < _uiTweenControllers.Count; i++) { UITweenController uiTweenController = _uiTweenControllers[i]; // if(uiTweenController.) uiTweenController.StartPlay(false); if (uiTweenController.maxDuration > maxDuration) { maxDuration = uiTweenController.maxDuration; } if (uiTweenController.isLoop) { isLoop = true; } } } isUpdate = true; currTime = 0; } public void Stop() { isUpdate = false; } public void StartPlay(bool isChildren) { _uiTweenControllers.Clear(); maxDuration = 0; _currPlay.Clear(); isLoop = false; for (int i = 0; i < GrpupInfos.Count; i++) { TweenAssetGrpupInfo tweenAssetGrpupInfo = GrpupInfos[i]; tweenAssetGrpupInfo.SetMaxTime(); if (tweenAssetGrpupInfo.isActive) { if (tweenAssetGrpupInfo.maxDuration > maxDuration) { maxDuration = tweenAssetGrpupInfo.maxDuration; } if (tweenAssetGrpupInfo.isLoop) { isLoop = true; } tweenAssetGrpupInfo.StartPlay(this); _currPlay.Add(tweenAssetGrpupInfo); } } if (isChildren) { UITweenController[] uiTweenControllers = gameObject.transform.GetComponentsInChildren(); _uiTweenControllers.AddRange(uiTweenControllers); _uiTweenControllers.Remove(this); for (int i = 0; i < _uiTweenControllers.Count; i++) { UITweenController uiTweenController = _uiTweenControllers[i]; uiTweenController.StartPlay(false); if (uiTweenController.maxDuration > maxDuration) { maxDuration = uiTweenController.maxDuration; } if (uiTweenController.isLoop) { isLoop = true; } } } isUpdate = true; currTime = 0; } public void SetMaxTime() { maxDuration = 0; for (int i = 0; i < GrpupInfos.Count; i++) { TweenAssetGrpupInfo tweenAssetGrpupInfo = GrpupInfos[i]; tweenAssetGrpupInfo.SetMaxTime(); if (tweenAssetGrpupInfo.isActive) { if (tweenAssetGrpupInfo.maxDuration > maxDuration) { maxDuration = tweenAssetGrpupInfo.maxDuration; } } } for (int i = 0; i < _uiTweenControllers.Count; i++) { UITweenController uiTweenController = _uiTweenControllers[i]; uiTweenController.SetMaxTime(); if (uiTweenController.maxDuration > maxDuration) { maxDuration = uiTweenController.maxDuration; } } } public void JumpToTime(float t) { _currPlay.Clear(); for (int i = 0; i < GrpupInfos.Count; i++) { TweenAssetGrpupInfo tweenAssetGrpupInfo = GrpupInfos[i]; tweenAssetGrpupInfo.SetMaxTime(); if (tweenAssetGrpupInfo.isActive) { if (tweenAssetGrpupInfo.maxDuration > maxDuration) { maxDuration = tweenAssetGrpupInfo.maxDuration; } // // if (tweenAssetGrpupInfo.isLoop) // { // isLoop = true; // } tweenAssetGrpupInfo.StartPlay(this); _currPlay.Add(tweenAssetGrpupInfo); } } for (int i = 0; i < _currPlay.Count; i++) { _currPlay[i].JumpToTime(this, t); // allTweenInfo[i].Rest(); } for (int i = 0; i < _currPlay.Count; i++) { _currPlay[i].PlayTween(this, t, true); } UITweenController[] uiTweenControllers = gameObject.transform.GetComponentsInChildren(); _uiTweenControllers.AddRange(uiTweenControllers); _uiTweenControllers.Remove(this); for (int i = 0; i < _uiTweenControllers.Count; i++) { UITweenController uiTweenController = _uiTweenControllers[i]; uiTweenController.JumpToTime(t); if (uiTweenController.maxDuration > maxDuration) { maxDuration = uiTweenController.maxDuration; } } // PlayTween(t, true); } private void PlayTween(float t, bool isFallBack) { for (int i = 0; i < GrpupInfos.Count; i++) { GrpupInfos[i].PlayTween(this, t, isFallBack); } } private void Update() { if (!isUpdate) { return; } currTime += Time.deltaTime; for (int i = 0; i < _currPlay.Count; i++) { _currPlay[i].PlayTween(this, currTime, false); } for (int i = 0; i < _uiTweenControllers.Count; i++) { _uiTweenControllers[i].PlayTween(currTime, false); } if (!isLoop && currTime >= maxDuration) { isUpdate = false; _currPlay.Clear(); } } } }