/* * @Author: 白哉 * @Description: * @Date: 2025年07月01日 星期二 11:07:48 * @Modify: */ using System.Collections.Generic; using TH1_Anim.Fragments; using UnityEngine; namespace TH1_Anim { public enum FragmentType{ None, Bounce, Move, Attack, AttackAndCounter, AttackAndCounterDie, MoveKill, NotMoveKill, GridUpdate, CityExp, CityExpUp, CityExpDown, CityLevelUp, Die, CityConnectExpUp, CityConnectExpDown, MoveExplorer, MoveTeleport, AttackAlly, AttackGround, Max } public static class FragmentFactory { public static FragmentBase Create(FragmentType type,IFragmentData data) { return type switch { FragmentType.Move => new FragmentMove(data as FragmentMoveData), FragmentType.AttackAndCounter or FragmentType.AttackAndCounterDie => new FragmentAttackAndCounter(data as FragmentAttackAndCounterData), FragmentType.Attack => new FragmentAttack(data as FragmentAttackAndCounterData), FragmentType.MoveKill => new FragmentMoveKill(data as FragmentAttackAndCounterData), FragmentType.NotMoveKill => new FragmentNotMoveKill(data as FragmentAttackAndCounterData), FragmentType.GridUpdate => new FragmentGridUpdate(data as FragmentGridUpdateData), FragmentType.CityExp => new FragmentCityExp(data as FragmentCityExpData), FragmentType.CityExpUp => new FragmentCityExpUp(data as FragmentCityExpUpData), FragmentType.CityExpDown => new FragmentCityExpUp(data as FragmentCityExpUpData), FragmentType.CityLevelUp => new FragmentCityLevelUp(data as FragmentCityExpUpData), FragmentType.Die => new FragmentDie(data as FragmentUnitData), FragmentType.CityConnectExpUp => new FragmentCityConnectExpUp(data as FragmentCityExpUpData), FragmentType.CityConnectExpDown => new FragmentCityConnectExpUp(data as FragmentCityExpUpData), FragmentType.MoveExplorer => new FragmentMoveExplorer(data as FragmentMoveExplorerData), FragmentType.MoveTeleport => new FragmentMoveTeleport(data as FragmentMoveData), FragmentType.AttackAlly => new FragmentAttackAlly(data as FragmentAttackAllyData), FragmentType.AttackGround => new FragmentAttackGround(data as FragmentAttackGroundData), _ => null }; } } public class FragmentManager { public static FragmentManager Instance = new FragmentManager(); private FragmentManager() { } public List Fragment => _fragments; private List _fragments =new List(); /* public void AddFragment(FragmentBase fragment) { _fragments.Add(fragment); Update(); }*/ public void Update() { foreach (var fragment in _fragments) { Debug.Log(fragment.State); switch( fragment.State) { case FragmentState.Wrong: fragment.OnFinished(); fragment.State = FragmentState.Finished; break; case FragmentState.Prepare: fragment.OnStart(Time.time); fragment.State = FragmentState.Playing; break; case FragmentState.Playing: fragment.OnUpdate(Time.time - fragment.StartTime); if (fragment.CheckDone(Time.time - fragment.StartTime) || fragment.TimeOut(Time.time - fragment.StartTime)) { fragment.OnFinished(); fragment.State = FragmentState.Finished; } break; } } for (int i = _fragments.Count - 1; i >= 0; i--) { if (_fragments[i].State != FragmentState.Finished) continue; _fragments.RemoveAt(i); } } public void UpdateFragment(FragmentBase fragment) { switch( fragment.State) { case FragmentState.Wrong: fragment.OnFinished(); Debug.Log($"Fragement State Wrong {fragment.GetType()}"); fragment.State = FragmentState.Finished; break; case FragmentState.Prepare: fragment.OnStart(Time.time); fragment.State = FragmentState.Playing; break; case FragmentState.Playing: fragment.OnUpdate(Time.time - fragment.StartTime); if (fragment.CheckDone(Time.time - fragment.StartTime) || fragment.TimeOut(Time.time - fragment.StartTime)) { fragment.OnFinished(); fragment.State = FragmentState.Finished; //fragment.OnFinishedCallback?.Invoke(); } break; case FragmentState.Finished: fragment.OnFinishedCallback?.Invoke(); break; } } } }