Unity新输入系统中获取Action Map的GUID方法
避免字符串引用,高效获取Unity新输入系统的Action Map引用
下面分享几个比手动打印GUID更高效的方案,彻底摆脱字符串硬编码的维护隐患:
1. 直接序列化InputActionMap引用(最省心)
Unity新输入系统的InputActionMap本身支持直接在Inspector面板拖拽赋值,完全不需要通过名称或GUID间接获取。
代码示例:
[SerializeField] private PlayerInput _playerInput; // 直接在Inspector里拖入对应的Action Map [SerializeField] private InputActionMap _gameplayMap; [SerializeField] private InputActionMap _uiMap; public void SwitchToGameplay() { _playerInput.SwitchCurrentActionMap(_gameplayMap); } public void SwitchToUI() { _playerInput.SwitchCurrentActionMap(_uiMap); }
这种方式直接引用对象实例,就算后续修改Action Map的名称,代码逻辑也不会受任何影响,直观又可靠。
2. 用ScriptableObject统一管理所有Action Map
如果项目里Action Map较多,可以创建一个专门的ScriptableObject来集中管理所有引用,避免每个脚本都单独拖拽:
[CreateAssetMenu(fileName = "InputMapReferences", menuName = "Input/Input Map References")] public class InputMapReferences : ScriptableObject { [SerializeField] public InputActionMap gameplayMap; [SerializeField] public InputActionMap uiMap; [SerializeField] public InputActionMap pauseMap; }
使用时只需要在脚本里引用这个ScriptableObject,就能直接获取所有Action Map:
[SerializeField] private PlayerInput _playerInput; [SerializeField] private InputMapReferences _inputMapRefs; public void OpenPauseMenu() { _playerInput.SwitchCurrentActionMap(_inputMapRefs.pauseMap); }
这种方式适合大型项目,所有Action Map的引用都集中在一个地方,维护起来非常方便。
3. 自定义编辑器工具一键导出GUID常量
如果确实需要用GUID(比如某些动态加载场景的需求),可以写个编辑器脚本一键生成包含所有Action Map GUID的常量类,彻底告别手动打印:
using UnityEditor; using UnityEngine; using UnityEngine.InputSystem; using System.IO; public static class InputMapGuidExporter { [MenuItem("Tools/Export Input Map GUIDs")] public static void ExportGuids() { // 选择你的InputActionAsset文件 string path = EditorUtility.OpenFilePanel("Select Input Action Asset", "Assets", "inputactions"); if (string.IsNullOrEmpty(path)) return; InputActionAsset asset = AssetDatabase.LoadAssetAtPath<InputActionAsset>(path); if (asset == null) { Debug.LogError("Failed to load Input Action Asset!"); return; } // 生成常量类代码 string code = "public static class InputMapGuids\n{\n"; foreach (var map in asset.actionMaps) { // 自动处理名称中的空格,生成合法的常量名 string constantName = map.name.Replace(" ", ""); code += $" public const string {constantName} = \"{map.id}\";\n"; } code += "}"; // 保存到指定路径(可自行修改) string savePath = Path.Combine(Application.dataPath, "Scripts/Input/InputMapGuids.cs"); File.WriteAllText(savePath, code); AssetDatabase.Refresh(); Debug.Log($"GUID常量脚本已生成:{savePath}"); } }
使用时只需点击顶部菜单Tools/Export Input Map GUIDs,选择你的.inputactions文件,就能自动生成包含所有GUID的常量类。后续修改Action Map名称后,重新导出一次即可更新常量,完全不用手动修改代码。
内容的提问来源于stack exchange,提问作者MeSteve95
相关产品推荐
相关产品推荐

