我已经使用 Unity 几天了,我正在尝试创建一个简单的平台。我目前正在做基本的玩家角色物理,但我正在尝试使用“新”输入系统,并且我的角色移动仅在每次按下时发生 1 帧,而不是能够按住它。
我尝试了一些方法,例如添加条件来检查回调的启动和执行状态,我发现问题在于函数本身会立即重置值,因为它多次获取 ReadValue 1 或至少它看起来是这样。
我已经为此苦苦挣扎了一段时间,但找不到解决方案,因为输入系统使用的事件似乎有时会被调用,如果不完全回避 UnityEvents 并使用我自己的事件,我将无法控制,这是一个痛苦的事情,这个小项目的重点是学习更好地使用 UnityEvents 和 InputSystem。 我还确保我不会愚蠢地在代码中的其他任何地方多次重置movement.x。
我尝试的越多,问题似乎就在于,在事件取消之前 ReadValue().x 本身设置为 0 时,它被应用于 moving.x 太多次,而且我找不到一个解决方案。
public void InputHorizontal(InputAction.CallbackContext context){
if (context.started)
{
if (context.ReadValue<Vector2>().x != 0)
{
playerStates |= States.Walking;
if (context.ReadValue<Vector2>().x < 0f)
{
playerStates &= ~States.FacingRight;
playerStates |= States.FacingLeft;
}
if (context.ReadValue<Vector2>().x > 0f)
{
playerStates &= ~States.FacingLeft;
playerStates |= States.FacingRight;
}
}
}
if (context.canceled)
{
playerStates &= ~States.Walking;
}}
void AddMovement(){
if (playerStates.HasFlag(States.Walking) || speed > 0)
{
if (playerStates.HasFlag(States.FacingRight))
{
movement.x = 1;
}
else
{
movement.x = -1;
}
}}
我通过回避问题来解决它。现在,移动实际上并不直接依赖于 context.ReadValue 并且它可以工作。这确实证实了 InputSystem 确实通过启动和执行的事件多次调用该函数。