Unity有限状态机

/// <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 按下空格






  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值