状态机
由题可知需要四个状态
先对四个状态和他们之间的关系进行处理
publicclassState{
publicStateMachine machine;
protectedfloat time;
publicvirtualvoid EnterState() {}
publicvirtualvoid UpdateState() {}
publicvirtualvoid ExitState() { }
}
publicclassIdle : State
{
privatefloat toWalkTime;
publicoverridevoid EnterState()
{
Debug.Log("进入站岗状态");
toWalkTime = Random.Range(2.0f, 3.0f);
}
publicoverridevoid UpdateState()
{
//持续站岗状态
time += Time.deltaTime;
if (time >= toWalkTime)
{
this.machine.ChangeState(StateType.Walk);
}
if (Input.GetKeyDown(KeyCode.F))
{
this.machine.ChangeState(StateType.Fire);
}
}
publicoverridevoid ExitState()
{
time = 0;
}
}
publicclassWalk : State
{
privatefloat toIdleTime;
publicoverridevoid EnterState()
{
Debug.Log("进入巡逻状态");
toIdleTime = Random.Range(3.0f, 5.0f);
}
publicoverridevoid UpdateState()
{
Debug.Log("持续巡逻状态");
time += Time.deltaTime;
if (time >= toIdleTime)
{
this.machine.ChangeState(StateType.Idle);
}
if (Input.GetKeyDown(KeyCode.F))
{
this.machine.ChangeState(StateType.Fire);
}
if (this.machine.hp<=0)
{
this.machine.ChangeState(StateType.Die);
}
}
publicoverridevoid ExitState()
{
time = 0;
}
}
publicclassFire :State
{
publicoverridevoid EnterState()
{
Debug.Log("进入开火状态");
}
publicoverridevoid UpdateState()
{
Debug.Log("持续开火状态");
if (Input.GetKeyDown(KeyCode.L))
{
this.machine.ChangeState(StateType.Walk);
}
if (this.machine.hp <= 0)
{
this.machine.ChangeState(StateType.Die);
}
}
publicoverridevoid ExitState()
{
}
}
publicclassDie : State
{
publicoverridevoid EnterState()
{
Debug.Log("进入死亡状态");
}
publicoverridevoid UpdateState()
{
}
publicoverridevoid ExitState()
{
}
}
规定状态之间相互切换
publicenumStateType
{
Idle,
Walk,
Fire,
Die
}
publicclassStateMachine
{
publicDictionary<StateType, State> dic = newDictionary<StateType, State>();
privateState currentState;
privateState lastState;
publicint hp = 5;
publicvoid Register(StateType key, State value)
{
value.machine = this;
dic.Add(key, value);
}
publicvoid ChangeState(StateType key)
{
if (dic.ContainsKey(key))
{
currentState = dic[key];
}
}
publicvoid DoWork()
{
if (currentState != lastState)
{
currentState.EnterState();
lastState = currentState;
}
currentState.UpdateState();
if (lastState != currentState)
{
lastState.ExitState();
}
if (Input.GetKeyDown(KeyCode.S))
{
hp--;
}
}
}
编写状态运行方法
publicclassAI : MonoBehaviour {
privateStateMachine stateMachine = newStateMachine();
// Use this for initialization
void Start () {
stateMachine.Register(StateType.Idle, newIdle());
stateMachine.Register(StateType.Walk, newWalk());
stateMachine.Register(StateType.Fire, newFire());
stateMachine.Register(StateType.Die, newDie());
stateMachine.ChangeState(StateType.Idle);
}
// Update is called once per frame
void Update () {
stateMachine.DoWork();
}
}