我如何将此状态机与我的移动代码一起使用?

How do I use this state machine with my movement code?

我看完了一些关于 unity 状态机的教程,现在我正试图弄清楚如何在我的玩家移动代码中实际使用一个,但我有点卡住了。我所遵循的教程已经展示了如何执行这样的 StateManager 脚本

public class PlayerStateManager : MonoBehaviour
{
    PlayerBaseState currentState; 
    public PlayerJumpState jumpState = new PlayerJumpState();
    public PlayerIdleState idleState = new PlayerIdleState();
    public PlayerRunState runState = new PlayerRunState();

    void Start()
    {
        currentState = idleState;

        currentState.EnterState(this);
    }

    void Update()
    {
        currentState.UpdateState(this);
    }

    public void SwitchState(PlayerBaseState state)
    {
        currentState = state;
        state.EnterState(this);
    }
}

现在我假设我需要做的就是使用这个

public class TestMovement : MonoBehaviour
{
    PlayerStateManager playerState;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            playerState.SwitchState(playerState.jumpState);
        }
    }
}

但这显然是不正确的,因为我在 SwitchState 的行中不断收到错误提示“NullReferenceException:对象引用未设置为对象的实例”。

TestMovement 中,您是否有 StartAwake 方法将某些内容分配给 playerState 字段?如果不是,则该字段永远不会分配,因此始终为空。

您可以做的另一件事是制作它 public PlayerStateManager playerState; 并在编辑器中为其分配一些内容。

playerState默认是私有的所以你必须制作public或[SerializeField]并在游戏引擎中引入它