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();
|
}
|
}
|
}
|
}
|