Unity 输入系统按钮多次触发

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

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

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

看来我不是唯一一个,看看这个论坛帖子

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

public void GetInteractValues( InputAction.CallbackContext value )
 {
     if ( value.started )
         print("foo");
 }
c# unity-game-engine input
6个回答
5
投票

这么晚了,但以防万一其他人感到困惑:多次调用是预期行为,并且在文档中列出了(尽管文档花了我一段时间才找到)。

根据此评论,请检查

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");
}

0
投票

正如 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
}

就我而言,我在唤醒方法中进行了检查,以避免在每个输入事件上执行此操作。我能做到这一点只是因为我注册了 C# 事件以将输入事件分派给多个对象:

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

    OnMove += playerController.Move;
}

0
投票

Issue 是 Unity 中的一个错误。解决方案是检查播放器预制件是否在场景中,因为播放器及其预制件(仅在播放器一上)正在触发。除了检查按钮回调之外,还可以使用以下命令。

gameObject.scene.IsValid()

0
投票

我不知道这是否有任何帮助,但我正在努力使用新的输入系统。与

Input.GetButtonDown()
相比,我看到的代码示例看起来过于复杂,因此我尝试使用玩家输入组件。我直接选择了Behavior == Use Unity Events,因为它让我可以将操作链接到脚本中的函数/方法。从纸面上看,这听起来不错,但后来我的功能被多次触发。

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

根据文档,您必须将

Behavior
设置为
SendMessages
并将您的函数/方法设置为
public void OnActionName ()
,例如动作:
Jump
,方法:
OnJump()

我这样做了,但仍然触发了多次。因此,在
InputAction
中,您需要将
Interaction
设置为
Press
,但请记住,
Lt
Rt
是可变的(即推一点即可射击一点,推得更用力则射击...... IDK),因此取消选中“按点”旁边的“默认”并将其设置为
1

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


0
投票

我也有同样的问题;

started
事件处理程序被调用两次 - 或者
performed
处理程序被
context.performed == true
调用两次。

问题是我的对象被销毁并重新创建,但只在

Awake()
中注册了处理程序,但没有在
OnDestroy()
中取消注册。所以处理程序被注册了两次。


0
投票

当我按下控制器上的按钮时,InputAction 引发多个 Started 和 Performed 事件。具体来说,如果按下控制器按钮打开一个新 UI,并且新 UI 订阅了与原始 InputAction 具有相同绑定的 InputAction,则新 UI 将立即接收 Started/Performed 事件。这是不受欢迎的。

为了解决这个问题,我必须向 InputAction 添加“Tap”交互,这会覆盖默认的“Press”交互。您可以通过打开 InputActions 文件并按操作属性编辑器中的“Interactions +”按钮来选择交互类型:

enter image description here

我还必须确保我的代码在响应按钮之前都收到“已启动”和“已执行”。

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