Unity有限状态机

来源:互联网 发布:软件著作权登记日期 编辑:程序博客网 时间:2024/05/19 23:58
/// <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 按下空格






原创粉丝点击