Unity中实现自定义按键映射设置菜单的方法咨询
Unity 自定义按键功能实现方案
1. 定义全局按键映射结构
用静态类存储全局按键映射,支持运行时修改和本地持久化,代码示例:
using UnityEngine; using System.Collections.Generic; public static class InputBindings { // 存储操作名和对应按键的映射 public static Dictionary<string, KeyCode> bindings = new Dictionary<string, KeyCode>(); // 预设默认按键配置 private static readonly Dictionary<string, KeyCode> defaultBindings = new Dictionary<string, KeyCode>() { {"前进", KeyCode.W}, {"后退", KeyCode.S}, {"左移", KeyCode.A}, {"右移", KeyCode.D}, {"跳跃", KeyCode.Space}, {"攻击", KeyCode.Mouse0} }; // 游戏启动时调用,加载本地存储的配置 public static void LoadBindings() { foreach (var item in defaultBindings) { // 优先读取本地存储的自定义配置,无配置则使用默认值 if (PlayerPrefs.HasKey($"Binding_{item.Key}")) { KeyCode savedKey = (KeyCode)System.Enum.Parse(typeof(KeyCode), PlayerPrefs.GetString($"Binding_{item.Key}")); bindings[item.Key] = savedKey; } else { bindings[item.Key] = item.Value; } } } // 修改配置后调用,持久化到本地 public static void SaveBindings() { foreach (var item in bindings) { PlayerPrefs.SetString($"Binding_{item.Key}", item.Value.ToString()); } PlayerPrefs.Save(); } }
游戏启动时调用一次InputBindings.LoadBindings()完成配置初始化即可。
2. 替换原有硬编码按键检测逻辑
把原有写死KeyCode的判断逻辑,替换为从映射表中读取对应的按键即可:
void Update() { // 替换原来的 Input.GetKey(KeyCode.W) if (Input.GetKey(InputBindings.bindings["前进"])) { // 执行前进逻辑 } if (Input.GetKeyDown(InputBindings.bindings["跳跃"])) { // 执行跳跃逻辑 } }
3. 实现设置页的按键监听逻辑
给设置菜单里的每个操作项绑定对应脚本,点击后进入待输入状态,监听用户下一次按下的按键完成绑定:
using UnityEngine; using UnityEngine.UI; public class KeyBindingItem : MonoBehaviour { public string actionName; // 和映射表里的操作名对应 public Text keyDisplayText; // 展示当前绑定按键的文本组件 private bool isListening = false; void OnEnable() { // 初始化显示当前绑定的按键 keyDisplayText.text = InputBindings.bindings[actionName].ToString(); } // 点击操作项时触发 public void OnClickBind() { isListening = true; keyDisplayText.text = "请输入按键..."; } void OnGUI() { if (isListening && Event.current.isKey) { // 可自定义排除规则,比如禁止绑定ESC作为操作按键 if (Event.current.keyCode == KeyCode.Escape) { isListening = false; keyDisplayText.text = InputBindings.bindings[actionName].ToString(); return; } // 绑定新按键 InputBindings.bindings[actionName] = Event.current.keyCode; keyDisplayText.text = Event.current.keyCode.ToString(); isListening = false; // 保存修改到本地 InputBindings.SaveBindings(); } } }
4. 可选优化项
- 增加按键冲突检测:绑定新按键前遍历映射表,判断该按键是否已经被其他操作占用,弹出提示询问用户是否覆盖
- 支持鼠标、手柄按键绑定:在监听逻辑中补充对应输入事件的判断规则即可
- 增加重置默认配置按钮:遍历映射表把值替换为
defaultBindings中的默认值后重新保存即可
内容的提问来源于stack exchange,提问作者alexpro_23
相关产品推荐
相关产品推荐

