TH1/Unity/Assets/Scripts/TH1_Anim/FragmentManager.cs
2025-10-23 20:33:44 +08:00

144 lines
5.4 KiB
C#

/*
* @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,
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),
_ => null
};
}
}
public class FragmentManager
{
public static FragmentManager Instance = new FragmentManager();
private FragmentManager() { }
public List<FragmentBase> Fragment => _fragments;
private List<FragmentBase> _fragments =new List<FragmentBase>();
/*
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:
Debug.Log("!!!");
fragment.OnFinishedCallback?.Invoke();
break;
}
}
}
}