You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity新输入系统Input Actions已启用但无响应问题求助

Unity新输入系统按键无响应问题(PlayerInput替代生成类后)

原本使用新输入系统生成的C#类时输入功能正常,为实现按键重绑定改用PlayerInput方案,删除GameControls生成脚本并适配自定义InputManager后,所有InputActions绑定的按键均无响应。调试显示动作及动作映射已启用,InputDebug窗口也能看到用户和预期动作,但触发逻辑完全失效。


相关信息

  • InputManager GameObject配置:挂载PlayerInput组件,关联对应Input Actions资源
  • InputManager核心代码:
public class InputManager : TrueSingleton<InputManager>
{
    public InputAction Movement { get; private set; } = null;
    public InputAction LookDirection { get; private set; } = null;
    public InputAction DodgeRoll { get; private set; } = null;
    public InputAction Run { get; private set; } = null;
    public InputAction Aim { get; private set; } = null;
    // 其他动作定义...

    PlayerInput playerInput;

    protected override void LoadDependencies()
    {
        playerInput = GetComponent<PlayerInput>();
        SetUpGameControls();
    }

    void SetUpGameControls()
    {
        Movement = playerInput.actions["Movement"];
        LookDirection = playerInput.actions["LookDirection"];
        DodgeRoll = playerInput.actions["DodgeRoll"];
        Run = playerInput.actions["Run"];
        Aim = playerInput.actions["Aim"];
        // 其他动作赋值...
    }

    public void ToggleActionMap(string actionMapName, bool newEnabled){
        if(newEnabled)
            playerInput.actions.FindActionMap(actionMapName).Enable();
        else
            playerInput.actions.FindActionMap(actionMapName).Disable();
    }
}
  • 外部脚本调用方式:
if ((InputManager.Instance.Cancel.triggered || InputManager.Instance.ToggleInventory.triggered) ||...)
  • 游戏控制方案:已配置对应按键绑定(如Movement关联WASD/摇杆)
  • InputDebug状态:显示存在1个用户,所有预期动作已加载
  • 调试确认:所有InputActions及动作映射均处于启用状态

已尝试的解决方法:给PlayerInput添加Unity事件、重启电脑、确认ProjectSettings/Player/Active Input Handling设为Both,问题仍未解决。


排查修复建议

  1. 检查PlayerInput的Behavior设置
    若用代码直接监听动作,建议将Behavior设为Invoke CSharp Events;若用Send Messages,需确保存在对应接收方法(如OnCancel(InputAction.CallbackContext context)),避免因Behavior设置不匹配导致事件无法传递。

  2. 验证动作名称匹配
    确认代码中playerInput.actions["动作名称"]的字符串与Input Actions资源里的动作完全一致(大小写、空格均需匹配),名称不匹配会导致动作引用失效。

  3. 调整动作映射启用时机
    确保ToggleActionMap在PlayerInput初始化完成后调用,可在Start()方法中手动触发默认动作映射的启用:

    void Start()
    {
        ToggleActionMap("Default", true); // 替换为你的默认动作映射名称
    }
    
  4. 检查动作触发类型
    确认Input Actions中各动作的触发类型正确:比如Cancel设为Button类型且触发方式为Press,Movement设为Value类型,类型不匹配会导致triggered属性无法正确触发。

  5. 直接绑定动作回调测试
    在InputManager中给动作绑定回调,测试是否能正常触发,排除外部调用逻辑问题:

    void SetUpGameControls()
    {
        // ...原有赋值代码
        Cancel.performed += ctx => Debug.Log("Cancel动作触发");
        Cancel.Enable();
    }
    

    运行后按键查看控制台输出,验证动作是否能正常响应。

  6. 确认单例初始化顺序
    调整InputManager的脚本执行顺序(在Project Settings -> Script Execution Order中设置更高优先级),确保单例初始化在其他调用它的脚本之前,避免获取到未初始化的实例导致动作引用为空。

  7. 重置Input Actions缓存
    在Input Actions资源文件上右键选择Generate C# Class(即使不使用生成类,可修复缓存问题),删除生成的脚本后重新运行游戏。


内容的提问来源于stack exchange,提问作者vinicius rosa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 15:03:19