所以,我在Unity中为我的播放器设置了状态机。我有一个Crouch状态和一个空闲状态。我希望玩家在我处于空闲状态时按下蹲伏按钮时蹲伏,当我蹲伏时我再次按下蹲伏按钮时返回空闲状态。问题(我认为)是当我按下蹲伏按钮时它会进入蹲伏状态,然后立即返回到空闲状态。我有另一个脚本,它根据玩家目前的状态检测每个状态并进行操作。解决这个问题的最佳方法是什么?这是我的代码:
// create date object from date + hour strings
var dateObj = moment.tz(date + hour, process.env.DATE_FORMAT + " HH:mm a", user_timezone);
答案 0 :(得分:0)
问题是你有一系列if
条件,在同一帧中都可以为真。
让我们看看一帧中发生了什么:
if (playerState == PlayerState.Idle)
条件已经过验证。if
声明中,if(Input.GetButtonDown("Crouch"))
条件已经过验证,因此您的播放器会进入PlayerState.CrouchedIdle
状态。if (playerState == PlayerState.Walking)
条件未经过验证,因此请跳到下一个。if (playerState == PlayerState.Sprinting)
条件未经过验证,因此请跳到下一个。if(playerState == PlayerState.CrouchedIdle)
条件已经过验证。if
声明中,if(Input.GetButtonDown("Crouch"))
条件已经过验证,因此您的播放器会再次进入PlayerState.Idle
状态!if(playerState == PlayerState.CrouchedWalking)
条件未经过验证。一种解决方案可能是使用一系列else if
而不是if
,这样你每帧只能改变一次状态(因为每帧只考虑一个条件)
我还建议查看用C#实现的状态机示例,以避免这种陷阱。