150 lines
5.7 KiB
C#
150 lines
5.7 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,
|
|
AttackAlly,
|
|
AttackGround,
|
|
SuikaFallingSplash,
|
|
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),
|
|
FragmentType.SuikaFallingSplash => new FragmentSuikaFallingSplash(data as FragmentSuikaFallingSplashData),
|
|
_ => 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:
|
|
fragment.OnFinishedCallback?.Invoke();
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|