我如何将此状态机与我的移动代码一起使用?
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
中,您是否有 Start
或 Awake
方法将某些内容分配给 playerState
字段?如果不是,则该字段永远不会分配,因此始终为空。
您可以做的另一件事是制作它 public PlayerStateManager playerState;
并在编辑器中为其分配一些内容。
playerState默认是私有的所以你必须制作public或[SerializeField]并在游戏引擎中引入它
我看完了一些关于 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
中,您是否有 Start
或 Awake
方法将某些内容分配给 playerState
字段?如果不是,则该字段永远不会分配,因此始终为空。
您可以做的另一件事是制作它 public PlayerStateManager playerState;
并在编辑器中为其分配一些内容。
playerState默认是私有的所以你必须制作public或[SerializeField]并在游戏引擎中引入它