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

Unity运行时设置Input Manager提交与取消键值的实现方法

实现Unity运行时动态设置Input Manager的提交/取消键值

下面提供三种可行方案,根据你的项目需求选择:

方案一:自定义输入检测逻辑(推荐,无兼容性风险)

绕过Unity内置的Input Manager,直接在代码中封装输入检测逻辑,完全可控且实现简单。

using UnityEngine;

public class CustomInputHandler : MonoBehaviour
{
    // 控制按键切换的条件
    public bool swapButtons;

    private KeyCode _submitKey;
    private KeyCode _cancelKey;

    void Update()
    {
        // 根据条件切换按键映射
        if (swapButtons)
        {
            _submitKey = KeyCode.Joystick1Button0;
            _cancelKey = KeyCode.Joystick1Button1;
        }
        else
        {
            _submitKey = KeyCode.Joystick1Button1;
            _cancelKey = KeyCode.Joystick1Button0;
        }

        // 检测提交输入
        if (Input.GetKeyDown(_submitKey))
        {
            Debug.Log("提交操作触发");
            // 此处添加你的提交逻辑
        }

        // 检测取消输入
        if (Input.GetKeyDown(_cancelKey))
        {
            Debug.Log("取消操作触发");
            // 此处添加你的取消逻辑
        }
    }
}

方案二:反射修改内置Input Manager(不推荐,有版本兼容性风险)

如果必须修改Unity内置Input Manager的Submit/Cancel键设置,可以通过反射访问Unity内部API实现。注意:该方法依赖Unity内部实现,不同版本可能失效,且运行时修改会同步到Project Settings(调用Save方法的话)。

using UnityEngine;
using System.Reflection;

public class InputManagerModifier : MonoBehaviour
{
    public bool swapButtons;

    void Update()
    {
        KeyCode submitKey, cancelKey;

        if (swapButtons)
        {
            submitKey = KeyCode.Joystick1Button0;
            cancelKey = KeyCode.Joystick1Button1;
        }
        else
        {
            submitKey = KeyCode.Joystick1Button1;
            cancelKey = KeyCode.Joystick1Button0;
        }

        // 通过反射获取InputSettings实例
        var inputSettingsType = typeof(UnityEditor.InputSettings);
        if (inputSettingsType == null) return;

        var getInstanceMethod = inputSettingsType.GetMethod("GetInstance", BindingFlags.Public | BindingFlags.Static);
        var inputSettingsInstance = getInstanceMethod?.Invoke(null, null);
        if (inputSettingsInstance == null) return;

        // 修改Submit按钮
        var submitProp = inputSettingsType.GetProperty("submitButton", BindingFlags.Public | BindingFlags.Instance);
        submitProp?.SetValue(inputSettingsInstance, submitKey.ToString());

        // 修改Cancel按钮
        var cancelProp = inputSettingsType.GetProperty("cancelButton", BindingFlags.Public | BindingFlags.Instance);
        cancelProp?.SetValue(inputSettingsInstance, cancelKey.ToString());

        // 可选:保存修改到Project Settings,退出Play模式后仍保留
        // inputSettingsType.GetMethod("Save", BindingFlags.Public | BindingFlags.Instance)?.Invoke(inputSettingsInstance, null);
    }
}

方案三:使用Unity新Input System(推荐,现代项目首选)

如果你的项目使用Unity官方的新Input System(通过Package Manager安装),可以更优雅地实现动态按键映射:

  1. 先创建Input Action Asset,定义Submit和Cancel两个Action;
  2. 给Player对象添加PlayerInput组件,关联创建的Input Action Asset;
  3. 编写以下代码实现动态绑定:
using UnityEngine;
using UnityEngine.InputSystem;

public class NewInputHandler : MonoBehaviour
{
    public bool swapButtons;
    private PlayerInput _playerInput;
    private InputAction _submitAction;
    private InputAction _cancelAction;

    void Awake()
    {
        _playerInput = GetComponent<PlayerInput>();
        _submitAction = _playerInput.actions["Submit"];
        _cancelAction = _playerInput.actions["Cancel"];
    }

    void Update()
    {
        // 清除之前的绑定覆盖
        _submitAction.RemoveAllBindingOverrides();
        _cancelAction.RemoveAllBindingOverrides();

        if (swapButtons)
        {
            // 绑定Submit到手柄按键0,Cancel到按键1
            _submitAction.AddBindingOverride("<Gamepad>/buttonSouth");
            _cancelAction.AddBindingOverride("<Gamepad>/buttonEast");
        }
        else
        {
            // 交换绑定
            _submitAction.AddBindingOverride("<Gamepad>/buttonEast");
            _cancelAction.AddBindingOverride("<Gamepad>/buttonSouth");
        }
    }

    // 绑定到Submit Action的回调方法
    public void OnSubmit(InputAction.CallbackContext context)
    {
        if (context.performed)
        {
            Debug.Log("提交操作触发");
            // 添加提交逻辑
        }
    }

    // 绑定到Cancel Action的回调方法
    public void OnCancel(InputAction.CallbackContext context)
    {
        if (context.performed)
        {
            Debug.Log("取消操作触发");
            // 添加取消逻辑
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 14:47:37