/// <summary>
/// 状态接口
/// </summary>
public interface StateBase
{
void Enter();
void Execute();
void Exit();
void HandlerInput();
}
/// <summary>
/// 状态机
/// </summary>
public class StateMachine : MonoBehaviour
{
/// <summary>
/// 状态引用
/// </summary>
public StateBase stateNow;
public void ChangeState(StateBase newState)
{
stateNow.Exit();
stateNow = newState;
stateNow.Enter();
stateNow.Execute();
}
public virtual void ResetState() { }
public void StateUpdate()
{
stateNow.HandlerInput();
}
}
/// <summary>
/// 状态实例
/// </summary>
public class InitialState : StateBase {
private PlayerMachine machine;
public InitialState(PlayerMachine machine)
{
this.machine = machine;
}
public void Enter()
{
}
public void Execute()
{
}
public void Exit()
{
}
public void HandlerInput()
{
if (Input.GetKeyDown(KeyCode.Space))
{
machine.ChangeState(machine.jumpState);
}
if (Input.GetKey(KeyCode.A))
{
machine.ChangeState(machine.walkState);
}
}
}
/// <summary>
/// 状态实例
/// </summary>
public class WalkState : StateBase
{
private PlayerMachine machine;
public WalkState(PlayerMachine machine)
{
this.machine = machine;
}
public void Enter()
{
Debug.Log("walk enter");
}
public void Execute()
{
Debug.Log("walk execute");
}
public void Exit()
{
Debug.Log("walk exit");
}
public void HandlerInput()
{
if (Input.GetKeyDown(KeyCode.Space))
{
machine.ChangeState(machine.jumpState);
}
else machine.ResetState();
}
}
/// <summary>
/// 状态实例
/// </summary>
public class JumpState : StateBase {
private PlayerMachine machine;
public JumpState(PlayerMachine machine)
{
this.machine = machine;
}
public void Enter()
{
Debug.Log("jump enter");
}
public void Execute()
{
Debug.Log("jump execute");
}
public void Exit()
{
Debug.Log("jump exit");
}
public void HandlerInput()
{
if (Input.GetKey(KeyCode.A))
{
machine.ChangeState(machine.walkState);
}
else machine.ResetState();
}
}
public class PlayerMachine : StateMachine {
public InitialState initialState;
public JumpState jumpState;
public WalkState walkState;
void Start () {
initialState = new InitialState(this);
jumpState = new JumpState(this);
walkState = new WalkState(this);
stateNow = initialState;
}
void Update () {
StateUpdate();
}
public override void ResetState()
{
ChangeState(initialState);
}
}
TEST 按下空格