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安装),可以更优雅地实现动态按键映射:
- 先创建Input Action Asset,定义
Submit和Cancel两个Action; - 给Player对象添加
PlayerInput组件,关联创建的Input Action Asset; - 编写以下代码实现动态绑定:
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
相关产品推荐
相关产品推荐

