- 这篇文章是无耻地复制/粘贴我在Unity论坛上的帖子:https://forum.unity.com/threads/input-system-doesnt-trigger-anything-anymore.717386/,但Stack Overflow似乎更活跃 *
- TL;DR:InputSystem几天前工作了,不要再触发任何东西了,halp。*
几天前我试用了新的输入系统,它真的很棒!我做了很多东西,试图了解最好的使用方法,最后,我有一个角色跳来跳去,到处移动,那太酷了!然后,我将代码合并到我们的开发分支中,然后上床睡觉。
今天,我想继续我的代码,但我的角色不再移动,动作没有触发(即使在调试器中检测到输入),我真的不知道为什么。要么代码合并覆盖了一些重要的设置(我知道你在想什么,是的,“Active Input Handling”设置在“Both”上,我只试着运行预览),要么我在我的小测试中做了一些重要的事情,我没有意识到。
所以我决定尝试在一个新的项目中重现我的步骤,也许你们可以帮助我找出我做错了什么?
1/创建一个新的2D项目(通过Hub)
2/安装最新的软件包(版本0。9.0)
3/单击该消息提示符上的Yes(是),激活设置x1c 0d1x中的新输入管理
4/重新启动Unity编辑器,因为它没有重新启动,即使消息说它会重新启动,并检查项目设置(是的,它在“两者”上,是的,我的脚本运行时版本是4。0)
5/创建一个新的GameObject并在其上添加PlayerInput
6/点击“Open Input Settings”并创建“InputSettings”资产
7/单击“创建操作。..”来创建我的ActionMap资产
8/在我的“Player”ActionMap上创建一个“TestAction”,并将其设置为键“t”
9/创建一个新的脚本“TestScript”,它包含一个OnTestAction()方法(只记录“test”)并启用测试Map/动作(只是为了确保):
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/像疯子一样按“Play”并发送垃圾邮件“T”以尝试显示调试(注意,在调试器中,创建了一个User,检测到我的“t”按下,我的TestAction存在并Map到“t”键上,但没有显示调试
这可能是一个愚蠢的问题,但它让我疯狂,我做错了什么?更令人气愤的是,它几天前工作!
其他信息:- 将输入管理从“两者”切换到“新输入系统(预览)不做任何事情-在Update()中的检查是我的动作被启用,每帧返回“真”-在Update()中的检查是我的动作被触发,每帧返回“假”-使用动作。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无效
7条答案
按热度按时间dba5bblo1#
您可能试图导入一个新的输入系统软件包以兼容多个输入设备。这些类型的错误是由于新旧输入系统包之间的冲突造成的,可能在最新的更新中得到解决。
要解决此问题,请在【配置】下的【编辑】-〉【项目设置】-〉【播放器】-〉【其他设置】下,选择【主动输入处理】。选择**Both**。Unity将重新启动。现在你的问题应该解决了。您将能够同时使用旧的输入系统包和新的。
4uqofj5v2#
检查输入调试器中是否有流氓 * 用户 *
我有非常相似的症状(输入系统会随机停止发送回调)。当我打开输入调试器时,它正在记录按键,但在我的脚本中从未调用回调。
重新启动Unity没有帮助。重启也没用。
我还在输入调试器中发现,输入系统中有2个“用户”(通过在场景中一次禁用一个游戏对象的过程)发现我不小心将我的输入动作资产的另一个副本附加到场景中的不同游戏对象,并且Unity正在将这个其他对象注册为第二玩家或“用户”,它被分配了我试图捕获的所有输入操作绑定。
流氓Action Asset实际上是在拦截这些操作,从而防止在预期脚本上调用回调。我不知道这是否是你的问题,但也许它会帮助其他人(像我一样)花了几个小时在论坛上寻找这个难以捉摸的问题的解决方案。
判断是否存在相同问题的一个简单方法是打开输入调试器,查看所需的操作是否实际Map到了感兴趣的用户。
输入调试器的屏幕剪辑:
对我来说,有一个意外的用户#1,只有一个用户(不是预期的那个)实际上有键绑定到所需的操作
disbfnqx3#
只是以防别人遇到这个问题,因为这解决了我的问题。请确保调用Enable()以启动路由事件。
nue99wik4#
我不知道这对你是否有效,但它对我有效,我也有同样的问题。
我创建了两个控制方案。移动的和PC移动的需要触摸屏,PC需要键盘和鼠标。这样做会使我的移动的输入事件停止触发。因此,将游戏手柄添加到我的移动的控制方案中可以再次触发事件。
检查你的控制方案,确保它允许你绑定的输入。
7lrncoxx5#
我也遇到过类似的问题,完全按照问题中描述的步骤重现。在我的例子中,我忘记设置控制方案。
添加它们后,问题得到了修复。
为此:
1.打开您的Input Action Asset。
1.选择左上角的控制方案。(比如键盘)(如果你没有添加控制方案,你的问题可能与我的不同)
1.进入【右键】〉【编辑控制方案】。EditControlScehme Screen Img
1.单击加号将控制方案添加到列表中。Add control scheme to the list Screen Img
1.选择要添加的控制方案。(本例中为键盘)Select control scheme Screen Img
1.应该看起来像这样:Added control scheme Screen Img
1.都准备好了保存一切,问题应该得到解决。
1.玩你的游戏,它应该工作。
uurv41yg6#
至少Unity 2020。1.2和输入系统1。0.0输入系统将随机停止正常工作。我知道的唯一修复方法是restarting Unity。
xzlaal3s7#
在我的特殊情况下,它是 ProjectSettings → Editor → EnterPlayModeOptions,应该启用
Reload Domain
。似乎输入系统有一些静态的状态,应该在新游戏之前清除。这就是为什么重新启动团结会在这种情况下有所帮助。恕我直言,如果需要的话,它应该强制域重新加载。
因此,临时解决方案是在您想要更改
InputActionAsset
时启用Domain Reload
,并在您完成后禁用它,因为启用此功能可以节省大量时间。