移动值在被 UnityEvent 取消之前会被重置

问题描述 投票:0回答:1

我已经使用 Unity 几天了,我正在尝试创建一个简单的平台。我目前正在做基本的玩家角色物理,但我正在尝试使用“新”输入系统,并且我的角色移动仅在每次按下时发生 1 帧,而不是能够按住它。

我尝试了一些方法,例如添加条件来检查回调的启动和执行状态,我发现问题在于函数本身会立即重置值,因为它多次获取 ReadValue 1 或至少它看起来是这样。 The input functionThe console prints

我已经为此苦苦挣扎了一段时间,但找不到解决方案,因为输入系统使用的事件似乎有时会被调用,如果不完全回避 UnityEvents 并使用我自己的事件,我将无法控制,这是一个痛苦的事情,这个小项目的重点是学习更好地使用 UnityEvents 和 InputSystem。 我还确保我不会愚蠢地在代码中的其他任何地方多次重置movement.x。 Other useful parts of code

我尝试的越多,问题似乎就在于,在事件取消之前 ReadValue().x 本身设置为 0 时,它被应用于 moving.x 太多次,而且我找不到一个解决方案。

c# unity-game-engine input game-physics
1个回答
0
投票
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 确实通过启动和执行的事件多次调用该函数。

© www.soinside.com 2019 - 2024. All rights reserved.