新的输入系统不再触发任何东西

Posted

技术标签:

【中文标题】新的输入系统不再触发任何东西【英文标题】:The new Input System doesn't trigger anything anymore 【发布时间】:2019-07-27 17:41:57 【问题描述】:

这篇文章无耻地复制/粘贴了我在 Unity 论坛上的帖子:https://forum.unity.com/threads/input-system-doesnt-trigger-anything-anymore.717386/,但 Stack Overflow 似乎更活跃

TL;DR : InputSystem 几天前工作了,不要再触发任何东西了,暂停。

几天前我尝试了新的输入系统,真是太棒了!我做了很多事情,试图了解使用它的最佳方式,最后,我的角色到处跳跃和移动,太酷了!然后,我将我的代码合并到我们的开发分支中并上床睡觉。

今天,我想继续我的代码,但我的角色不再移动,没有触发动作(即使在调试器中检测到输入),我真的不知道为什么。代码合并覆盖了一些重要的设置(我知道你在想什么,是的,“活动输入处理”设置在“两者”上,我只尝试运行预览)或者我在我的小测试中做了一些重要的事情,我没想到。

所以我决定尝试在一个新项目中重现我的步骤,也许你们可以帮我弄清楚我做错了什么?

1/ 创建一个新的 2D 项目(通过 Hub)

2/ 安装最新的包(0.9.0版)

3/ 在该消息提示上单击“是”以激活设置中的新输入管理

4/ 重新启动 Unity 编辑器,因为即使消息说它会重新启动它也没有重新启动并检查项目设置(是的,它在“Both”上,是的,我的脚本运行时版本是 4.0)

5/ 创建一个新的 GameObject 并在其上添加一个 PlayerInput

6/ 点击“打开输入设置”并创建一个“输入设置”资产

7/ 点击“Create Actions...”来创建我的 ActionMap 资产

8/ 在我的“Player”ActionMap 上创建一个“TestAction”并将其设置为键“t”

9/ 创建一个新脚本“TestScript”,其中包含一个 OnTestAction() 方法(仅记录“test”)并启用测试地图/动作(只是为了确定):

using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.InputSystem.PlayerInput;

public class TestScript : MonoBehaviour

    void Start()
    
        InputActionMap playerActionMap = GetComponent<PlayerInput>().actions.GetActionMap("Player");
        playerActionMap.Enable();
        playerActionMap.GetAction("TestAction").Enable(); //Just to be sure
    

    public void OnTestAction()
    
        Debug.Log("test");
    

10/ 像疯子一样按“播放”并发送垃圾邮件“T”以尝试显示调试(请注意,在调试器中,创建了一个用户,检测到我的“t”按下,我的 TestAction 存在并被映射在“t”键上但不显示调试

这可能是一个愚蠢的问题,但它让我发疯,我做错了什么?更令人气愤的是前几天还有效!

附加信息: - 将输入管理从“两者”切换到“新输入系统(预览版)没有任何作用 - 检查 Update() 是否启用了我的操作,每帧返回“True” - 检查更新()是我的动作被触发返回“假”每一帧 - 使用 action.started/triggered/performed 什么都不做(我也尝试为此切换到 UnityEvent 或 C# 事件):

public class TestScript : MonoBehaviour

    InputAction a;

    void Start()
    
        InputActionMap playerActionMap = GetComponent<PlayerInput>().actions.GetActionMap("Player");
        playerActionMap.Enable();
        a = playerActionMap.GetAction("TestAction");
        a.Enable(); //Just to be sure
        a.started += OnTriggeredTestAction;
        a.performed += OnTriggeredTestAction;
        a.canceled += OnTriggeredTestAction;
    

    public void OnTestAction()
    
        Debug.Log("test");
    

    public void OnTriggeredTestAction(InputAction.CallbackContext ctx)
    
        Debug.Log("test triggered");
    

直接注入我的 TestAction 的 InputActionReference 并使用它没有任何作用 强制“默认控制方案”和“默认操作映射”无济于事 使用 BroadcastMessage 或 UnityEvents 不起作用

【问题讨论】:

我通过重新启动计算机解决了这个问题:输入系统似乎是基于您的计算机已经开启了多长时间,所以重新启动解决了它。注意调试器中不应该是这样的负时间。 天啊...你确定这是问题所在吗?如果这是真的……那太可怕了。 【参考方案1】:

您可能尝试导入新的输入系统包以兼容多种输入设备。这些类型的错误是由于新旧输入系统包之间的冲突造成的,并且可能在最新更新中得到解决。

要解决此问题,请转到编辑 -> 项目设置->播放器->在其他设置下> 配置下是选项主动输入处理。选择 Both。 Unity 将重新启动。现在你的问题应该解决了。您将能够同时使用旧的输入系统包和新的输入系统包。

【讨论】:

【参考方案2】:

我不知道这是否对你有用,但它对我有用,我也遇到了同样的问题。

我创建了 2 个控制方案。手机和电脑。移动设备需要触摸屏,PC 需要键盘和鼠标。这样做使我的移动输入事件停止触发。因此,将游戏手柄添加到我的移动控制方案允许事件再次触发。

TLDR。检查您的控制方案,确保它允许您绑定到的输入。

【讨论】:

【参考方案3】:

在输入调试器中检查流氓用户

我的症状非常相似(输入系统会随机停止发送回调)。当我打开输入调试器时,它正在注册按键,但在我的脚本中从未调用过回调。

重新启动 Unity 没有帮助。 重新启动没有帮助。

我还在输入调试器中发现输入系统中有 2 个“用户”,并且(通过一次禁用场景中的游戏对象的过程)发现我不小心附加了另一个输入动作资产副本到场景中的另一个游戏对象,并且 Unity 将这个另一个对象注册为第二个玩家或“用户”,它被分配了我试图捕获的所有输入动作绑定。

流氓动作资源本质上是拦截动作,阻止回调在预期脚本上被调用。我不知道这是否是您的特殊问题,但也许它会帮助其他人(如我)花费数小时在论坛中倾注,寻找这个难以捉摸的问题的解决方案。

判断您是否遇到相同问题的一种简单方法是打开输入调试器并查看所需操作是否实际映射到感兴趣的用户。

输入调试器的截屏:

对我来说,有一个意外的用户 #1,只有一个用户(不是预期的用户)实际上将键绑定到所需的操作

【讨论】:

【参考方案4】:

至少从 Unity 2020.1.2 和输入系统 1.0.0 开始,输入系统将随机停止正常工作。我知道的唯一解决方法是restarting Unity。

【讨论】:

以上是关于新的输入系统不再触发任何东西的主要内容,如果未能解决你的问题,请参考以下文章

下拉转换为单选按钮,不再触发特定功能

输入未更改时观察者未触发更新事件 - Laravel

SwiftUI 为啥 Picker 上的输入不起作用?

编辑器中的 Unity 触摸事件? (新的输入系统)

将输入转换为字符串

Eclipse 不再允许 Shift-F