【问题标题】:Unity Input System Button Triggers Multiple TimesUnity 输入系统按钮多次触发
【发布时间】:2020-07-03 02:30:12
【问题描述】:

所以我一直在玩新的输入系统,但事情开始变得有点令人沮丧。我的问题是按钮按下多次触发。我已经尝试了多种操作类型的设置(例如按钮、通过等),并且交互设置为仅按下、释放或其他,似乎并不重要。根据设置,它会触发 2 次或 4 次。

我在这里有多个控制器用于测试,似乎这还不够令人困惑,如果第二个或更多玩家加入,他们的按钮只会触发一次。总是只有玩家的按钮会触发多次。有谁知道如何解决这个问题?

看来我不是唯一一个,looking at this forum thread

这是我非常简单的基本测试代码,仅供参考。

public void GetInteractValues( InputAction.CallbackContext value )
 {
     if ( value.started )
         print("foo");
 }

【问题讨论】:

    标签: c# unity3d input


    【解决方案1】:

    来晚了,但万一其他人感到困惑:多次调用是预期行为,是listed in the documentation(尽管文档花了我一段时间才找到)。

    根据this comment,检查context.performed

    public void OnMyAction(InputAction.CallbackContext context)
    {
        if (context.started)
            Debug.Log("Action was started");
        else if (context.performed)
            Debug.Log("Action was performed");
        else if (context.canceled)
            Debug.Log("Action was cancelled");
    }
    

    【讨论】:

      【解决方案2】:

      正如 LexGear 在这里回复https://stackoverflow.com/a/63459803/5277266,检查游戏对象是否在有效场景中是一种解决方案,另一种方法是检查游戏对象是否处于活动状态:

      public void Move(InputAction.CallbackContext ctx)
      {
          // to avoid prefab dispatching the event...
          if (!gameObject.activeInHierarchy) // or if (!gameObject.scene.IsValid())
          {
              return;
          }
      
          // do things with the event
      }
      

      就我而言,我在 awake 方法中进行了检查,以避免在每个输入事件上都进行检查。我可以这样做只是因为我注册了 C# 事件以将输入事件分派给多个对象:

      void Awake()
      {
          // to avoid prefab dispatching the event...
          if (!gameObject.activeInHierarchy)
          {
              return;
          }
      
          OnMove += playerController.Move;
      }
      

      【讨论】:

        【解决方案3】:

        问题是 Unity 中的一个错误。解决方案是检查玩家预制件是否在场景中,因为玩家和它的预制件(仅在玩家一号上)正在触发。除了检查按钮回调之外,还可以使用以下方法。

        gameObject.scene.IsValid()
        

        【讨论】:

          【解决方案4】:

          我不知道这是否有任何帮助,但我在努力使用新的输入系统。与Input.GetButtonDown() 相比,我看到的代码示例看起来过于复杂,因此我尝试使用播放器输入组件。我直接选择Behavior == Use Unity Events,因为它让我可以将动作链接到脚本中的函数/方法。在纸面上,这听起来不错,但后来我的函数被触发了多次。

          这正是 Unity 事件的工作方式:“开始 -> 执行 -> 取消”。

          According to the docs,您必须将Behavior 设置为SendMessages,并将您的函数/方法设置为public void OnActionName (),例如行动:Jump,方法:OnJump()
          我这样做了,但它仍然触发了多次。所以在InputAction 中你需要将Interaction 设置为Press,但请记住LtRt 是可变的(即推一点射一点,用力推射...更猛) IDK)所以取消选中 Press Point 旁边的 Default 并将其设置为 1

          希望有人在 4 天前向我解释了这一点。希望它可以帮助某人。

          【讨论】:

          • 这解决了我向左或向右移动时的问题,播放器一直在运行...
          猜你喜欢
          • 2022-09-25
          • 2022-01-21
          • 1970-01-01
          • 1970-01-01
          • 2017-06-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多