using UnityEngine; using UnityEngine.Events; public abstract class FsmBase { public abstract void OnEnter(); public abstract void OnLeave(); public abstract void Update(); } public enum AnimaState { Attack, Move, GetHit, Die, MaxValue } public class FsmManager { FsmBase[] allState;//初始化的时候就知道到底有多少个 sbyte stateIndex; sbyte curIndex; public FsmManager(byte stateCount) { allState = new FsmBase[stateCount]; stateIndex = -1; curIndex = -1; } public void AddState(FsmBase state) { if (stateIndex < allState.Length) { stateIndex++; allState[stateIndex] = state; } } public void ChangeState(sbyte stateNuber) { stateNuber = (sbyte)(stateNuber % allState.Length); if (curIndex != -1)//之前有状态 { allState[curIndex].OnLeave(); } curIndex = stateNuber; allState[curIndex].OnEnter(); } public void Update() { if (curIndex != -1) { allState[curIndex].Update(); } } } public class EnemyMove : FsmBase { private MeshRenderer m_renderer; private Material mat; public EnemyMove(MeshRenderer renderer, Material material) { m_renderer = renderer; mat = material; } public override void OnEnter() { if (m_renderer.material != mat) { m_renderer.material = mat; } } public override void OnLeave() { } public override void Update() { } } public class EnemyAttack : FsmBase { private MeshRenderer m_renderer; private Material mat; float timeCount; UnityAction callBack; public EnemyAttack(MeshRenderer renderer, Material material, UnityAction unityAction) { m_renderer = renderer; mat = material; callBack = unityAction; } public override void OnEnter() { timeCount = 0; if (m_renderer.material != mat) { m_renderer.material = mat; } } public override void OnLeave() { } public override void Update() { timeCount += Time.deltaTime; if (timeCount > 0.9f) { timeCount = 0; if (callBack != null) { callBack(); } } } } public class EnemyGetHit : FsmBase { private MeshRenderer m_renderer; private Material mat; float timeCount; UnityAction callBack; public EnemyGetHit(MeshRenderer renderer, Material material, UnityAction unityAction) { m_renderer = renderer; mat = material; callBack = unityAction; } public override void OnEnter() { timeCount = 0; if (m_renderer.material != mat) { m_renderer.material = mat; } } public override void OnLeave() { } public override void Update() { timeCount += Time.deltaTime; if (timeCount > 0.7f) { timeCount = 0; if (callBack != null) { callBack(); } } } } public class EnemyDie : FsmBase { private MeshRenderer m_renderer; private Material mat; float timeCount; UnityAction callBack; public EnemyDie(MeshRenderer renderer, Material material, UnityAction unityAction) { m_renderer = renderer; mat = material; callBack = unityAction; } public override void OnEnter() { timeCount = 0; if (m_renderer.material != mat) { m_renderer.material = mat; } } public override void OnLeave() { } public override void Update() { timeCount += Time.deltaTime; if (timeCount > 0.7f) { timeCount = 0; if (callBack != null) { callBack(); } } } }