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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 17:45:03