From 2b572c798957fa3bc21ddec25b4e28c01515a739 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=80=9D=E6=B5=B7?= <1464576565@qq.com> Date: Wed, 11 Mar 2026 13:04:31 +0800 Subject: [PATCH] 11 --- Client/Assets/.claude/settings.local.json | 3 +- Client/Assets/InputGlyph/GlyphService.cs | 73 +++++++++++++++++- .../Assets/InputGlyph/InputBindingManager.cs | 64 +++++++++++---- .../Assets/InputGlyph/InputGlyphDatabase.cs | 45 +++++++++-- .../InputGlyph/InputGlyphDatabaseEditor.cs | 26 +++---- Client/Assets/InputGlyph/InputGlyphImage.cs | 14 +++- Client/Assets/InputGlyph/InputGlyphText.cs | 14 +++- .../Assets/InputGlyph/InputGlyphUXButton.cs | 17 +++- Client/Assets/InputGlyph/TestRebindScript.cs | 63 ++++++++++++--- Client/Assets/Test.meta | 8 ++ Client/Assets/Test/GameBase.dll.bytes | Bin 0 -> 5120 bytes Client/Assets/Test/GameBase.dll.bytes.meta | 7 ++ Client/Assets/Test/GameBase.pdb.bytes | Bin 0 -> 18524 bytes Client/Assets/Test/GameBase.pdb.bytes.meta | 7 ++ Client/Assets/Test/GameLib.dll.bytes | Bin 0 -> 5120 bytes Client/Assets/Test/GameLib.dll.bytes.meta | 7 ++ Client/Assets/Test/GameLib.pdb.bytes | Bin 0 -> 18432 bytes Client/Assets/Test/GameLib.pdb.bytes.meta | 7 ++ Client/Assets/Test/GameLogic.dll.bytes | Bin 0 -> 59392 bytes Client/Assets/Test/GameLogic.dll.bytes.meta | 7 ++ Client/Assets/Test/GameLogic.pdb.bytes | Bin 0 -> 24296 bytes Client/Assets/Test/GameLogic.pdb.bytes.meta | 7 ++ Client/Assets/Test/GameProto.dll.bytes | Bin 0 -> 4608 bytes Client/Assets/Test/GameProto.dll.bytes.meta | 7 ++ Client/Assets/Test/GameProto.pdb.bytes | Bin 0 -> 18368 bytes Client/Assets/Test/GameProto.pdb.bytes.meta | 7 ++ .../Simulate/DefaultPackage_Simulate.bytes | Bin 2105 -> 2105 bytes .../Simulate/DefaultPackage_Simulate.hash | 2 +- .../Simulate/DefaultPackage_Simulate.json | 2 +- 29 files changed, 334 insertions(+), 53 deletions(-) create mode 100644 Client/Assets/Test.meta create mode 100644 Client/Assets/Test/GameBase.dll.bytes create mode 100644 Client/Assets/Test/GameBase.dll.bytes.meta create mode 100644 Client/Assets/Test/GameBase.pdb.bytes create mode 100644 Client/Assets/Test/GameBase.pdb.bytes.meta create mode 100644 Client/Assets/Test/GameLib.dll.bytes create mode 100644 Client/Assets/Test/GameLib.dll.bytes.meta create mode 100644 Client/Assets/Test/GameLib.pdb.bytes create mode 100644 Client/Assets/Test/GameLib.pdb.bytes.meta create mode 100644 Client/Assets/Test/GameLogic.dll.bytes create mode 100644 Client/Assets/Test/GameLogic.dll.bytes.meta create mode 100644 Client/Assets/Test/GameLogic.pdb.bytes create mode 100644 Client/Assets/Test/GameLogic.pdb.bytes.meta create mode 100644 Client/Assets/Test/GameProto.dll.bytes create mode 100644 Client/Assets/Test/GameProto.dll.bytes.meta create mode 100644 Client/Assets/Test/GameProto.pdb.bytes create mode 100644 Client/Assets/Test/GameProto.pdb.bytes.meta diff --git a/Client/Assets/.claude/settings.local.json b/Client/Assets/.claude/settings.local.json index e8e2c8e..2fa1be9 100644 --- a/Client/Assets/.claude/settings.local.json +++ b/Client/Assets/.claude/settings.local.json @@ -1,7 +1,8 @@ { "permissions": { "allow": [ - "Bash(cd InputGlyph && ls -la *.cs)" + "Bash(cd InputGlyph && ls -la *.cs)", + "Bash(ls -la InputGlyph/*.cs | grep -v Editor)" ] } } diff --git a/Client/Assets/InputGlyph/GlyphService.cs b/Client/Assets/InputGlyph/GlyphService.cs index 4247964..3d0afb7 100644 --- a/Client/Assets/InputGlyph/GlyphService.cs +++ b/Client/Assets/InputGlyph/GlyphService.cs @@ -4,12 +4,15 @@ using UnityEngine.InputSystem; public static class GlyphService { - // Cached device hint arrays to avoid allocations + // 缓存的设备提示数组,避免内存分配 private static readonly string[] KeyboardHints = { "Keyboard", "Mouse" }; private static readonly string[] XboxHints = { "XInput", "Xbox", "Gamepad" }; private static readonly string[] PlayStationHints = { "DualShock", "DualSense", "PlayStation", "Gamepad" }; private static readonly char[] TrimChars = { '{', '}', '<', '>', '\'', '"' }; + /// + /// 获取输入图标数据库实例 + /// public static InputGlyphDatabase Database { get @@ -26,6 +29,13 @@ public static class GlyphService private static InputGlyphDatabase _database; + /// + /// 获取输入操作的绑定控制路径 + /// + /// 输入操作 + /// 复合部分名称(可选) + /// 设备类型覆盖(可选) + /// 绑定控制路径 public static string GetBindingControlPath(InputAction action, string compositePartName = null, InputDeviceWatcher.InputDeviceCategory? deviceOverride = null) { if (action == null) return string.Empty; @@ -33,18 +43,46 @@ public static class GlyphService return binding.hasOverrides ? binding.effectivePath : binding.path; } + /// + /// 尝试获取输入操作的 TextMeshPro 标签 + /// + /// 输入操作引用 + /// 复合部分名称 + /// 设备类型 + /// 输出的 TMP 标签 + /// 显示回退文本 + /// 数据库实例(可选) + /// 是否成功获取 public static bool TryGetTMPTagForActionPath(InputAction reference, string compositePartName, InputDeviceWatcher.InputDeviceCategory device, out string tag, out string displayFallback, InputGlyphDatabase db = null) { string path = GetBindingControlPath(reference, compositePartName, device); return TryGetTMPTagForActionPath(path, device, out tag, out displayFallback, db); } + /// + /// 尝试获取输入操作的 UI Sprite + /// + /// 输入操作引用 + /// 复合部分名称 + /// 设备类型 + /// 输出的 Sprite + /// 数据库实例(可选) + /// 是否成功获取 public static bool TryGetUISpriteForActionPath(InputAction reference, string compositePartName, InputDeviceWatcher.InputDeviceCategory device, out Sprite sprite, InputGlyphDatabase db = null) { string path = GetBindingControlPath(reference, compositePartName, device); return TryGetUISpriteForActionPath(path, device, out sprite, db); } + /// + /// 根据控制路径尝试获取 TextMeshPro 标签 + /// + /// 控制路径 + /// 设备类型 + /// 输出的 TMP 标签 + /// 显示回退文本 + /// 数据库实例(可选) + /// 是否成功获取 public static bool TryGetTMPTagForActionPath(string controlPath, InputDeviceWatcher.InputDeviceCategory device, out string tag, out string displayFallback, InputGlyphDatabase db = null) { tag = null; @@ -60,6 +98,14 @@ public static class GlyphService return true; } + /// + /// 根据控制路径尝试获取 UI Sprite + /// + /// 控制路径 + /// 设备类型 + /// 输出的 Sprite + /// 数据库实例(可选) + /// 是否成功获取 public static bool TryGetUISpriteForActionPath(string controlPath, InputDeviceWatcher.InputDeviceCategory device, out Sprite sprite, InputGlyphDatabase db = null) { sprite = null; @@ -70,6 +116,9 @@ public static class GlyphService } + /// + /// 获取输入操作的绑定控制 + /// static InputBinding GetBindingControl(InputAction action, string compositePartName = null, InputDeviceWatcher.InputDeviceCategory? deviceOverride = null) { if (action == null) return default; @@ -85,7 +134,7 @@ public static class GlyphService if (!string.Equals(b.name, compositePartName, StringComparison.OrdinalIgnoreCase)) continue; } - // Replace LINQ Any() to avoid delegate allocation + // 替换 LINQ Any() 以避免委托分配 if (!string.IsNullOrEmpty(b.path) && ContainsAnyHint(b.path, hints)) return b; if (!string.IsNullOrEmpty(b.effectivePath) && ContainsAnyHint(b.effectivePath, hints)) return b; } @@ -93,7 +142,10 @@ public static class GlyphService return default; } - // Helper method to avoid LINQ Any() allocation + // 辅助方法,避免 LINQ Any() 的内存分配 + /// + /// 检查路径是否包含任何提示字符串 + /// static bool ContainsAnyHint(string path, string[] hints) { for (int i = 0; i < hints.Length; i++) @@ -104,6 +156,9 @@ public static class GlyphService return false; } + /// + /// 根据设备类型获取设备提示字符串数组 + /// static string[] GetDeviceHintsForCategory(InputDeviceWatcher.InputDeviceCategory cat) { switch (cat) @@ -120,6 +175,13 @@ public static class GlyphService } + /// + /// 从输入操作获取显示名称 + /// + /// 输入操作 + /// 复合部分名称(可选) + /// 设备类型覆盖 + /// 显示名称 public static string GetDisplayNameFromInputAction(InputAction action, string compositePartName = null, InputDeviceWatcher.InputDeviceCategory deviceOverride = InputDeviceWatcher.InputDeviceCategory.Keyboard) { if (action == null) return string.Empty; @@ -127,6 +189,11 @@ public static class GlyphService return binding.ToDisplayString(); } + /// + /// 从控制路径获取显示名称 + /// + /// 控制路径 + /// 显示名称 public static string GetDisplayNameFromControlPath(string controlPath) { if (string.IsNullOrEmpty(controlPath)) return string.Empty; diff --git a/Client/Assets/InputGlyph/InputBindingManager.cs b/Client/Assets/InputGlyph/InputBindingManager.cs index 8f42efb..87c63bd 100644 --- a/Client/Assets/InputGlyph/InputBindingManager.cs +++ b/Client/Assets/InputGlyph/InputBindingManager.cs @@ -37,14 +37,14 @@ using Cysharp.Threading.Tasks; private string cachedSavePath; private Dictionary actionLookup = new Dictionary(); - // Events to replace Rx.NET Subjects + // 用于替代 Rx.NET Subjects 的事件 private event Action _onInputsInit; public event Action OnInputsInit { add { _onInputsInit += value; - // Replay behavior: if already initialized, invoke immediately + // 重放行为:如果已经初始化,立即调用 if (isInputsInitialized) { value?.Invoke(); @@ -152,7 +152,7 @@ using Cysharp.Threading.Tasks; rebindOperation?.Dispose(); rebindOperation = null; - // Clear all event handlers + // 清除所有事件处理器 _onInputsInit = null; OnApply = null; OnRebindPrepare = null; @@ -163,19 +163,19 @@ using Cysharp.Threading.Tasks; private void BuildActionMap() { - // Pre-allocate with known capacity to avoid resizing + // 预分配已知容量以避免调整大小 int mapCount = actions.actionMaps.Count; actionMap.Clear(); actionLookup.Clear(); - // Estimate total action count for better allocation + // 估算总操作数以便更好地分配内存 int estimatedActionCount = 0; foreach (var map in actions.actionMaps) { estimatedActionCount += map.actions.Count; } - // Ensure capacity to avoid rehashing + // 确保容量以避免重新哈希 if (actionMap.Count == 0) { actionMap = new Dictionary(mapCount); @@ -187,7 +187,7 @@ using Cysharp.Threading.Tasks; var actionMapObj = new ActionMap(map); actionMap.Add(map.name, actionMapObj); - // Build lookup dictionary for O(1) action access + // 构建查找字典以实现 O(1) 操作访问 foreach (var actionPair in actionMapObj.actions) { actionLookup[actionPair.Key] = (actionMapObj, actionPair.Value); @@ -367,6 +367,11 @@ using Cysharp.Threading.Tasks; /* ---------------- Public API ---------------- */ + /// + /// 根据操作名称获取输入操作 + /// + /// 操作名称 + /// 输入操作,未找到则返回 null public static InputAction Action(string actionName) { var instance = Instance; @@ -381,12 +386,17 @@ using Cysharp.Threading.Tasks; return null; } + /// + /// 开始重新绑定指定的输入操作 + /// + /// 操作名称 + /// 复合部分名称(可选) public static void StartRebind(string actionName, string compositePartName = null) { var action = Action(actionName); if (action == null) return; - // decide bindingIndex & deviceMatch automatically + // 自动决定 bindingIndex 和 deviceMatch int bindingIndex = Instance.FindBestBindingIndexForKeyboard(action, compositePartName); if (bindingIndex < 0) { @@ -403,15 +413,23 @@ using Cysharp.Threading.Tasks; } } + /// + /// 取消当前的重新绑定操作 + /// public static void CancelRebind() => Instance.rebindOperation?.Cancel(); + /// + /// 确认并应用准备好的重新绑定 + /// + /// 是否清除冲突 + /// 是否成功应用 public static async UniTask ConfirmApply(bool clearConflicts = true) { if (!Instance.isApplyPending) return false; try { - // Create a copy of the prepared rebinds before clearing + // 在清除之前创建准备好的重绑定的副本 var appliedContexts = new HashSet(Instance.preparedRebinds); foreach (var ctx in Instance.preparedRebinds) @@ -454,11 +472,14 @@ using Cysharp.Threading.Tasks; } } + /// + /// 丢弃准备好的重新绑定 + /// public static void DiscardPrepared() { if (!Instance.isApplyPending) return; - // Create a copy of the prepared rebinds before clearing (for event notification) + // 在清除之前创建准备好的重绑定的副本(用于事件通知) var discardedContexts = new HashSet(Instance.preparedRebinds); Instance.preparedRebinds.Clear(); @@ -583,7 +604,7 @@ using Cysharp.Threading.Tasks; private void PrepareRebind(RebindContext context) { - // Remove existing rebind for same action/binding if exists + // 如果存在相同操作/绑定的现有重绑定,则移除 preparedRebinds.Remove(context); if (string.IsNullOrEmpty(context.overridePath)) @@ -626,6 +647,9 @@ using Cysharp.Threading.Tasks; } } + /// + /// 重置所有绑定到默认值 + /// public async UniTask ResetToDefaultAsync() { try @@ -661,6 +685,12 @@ using Cysharp.Threading.Tasks; } } + /// + /// 获取指定操作的绑定路径 + /// + /// 操作名称 + /// 绑定索引 + /// 绑定路径,未找到则返回 null public static BindingPath GetBindingPath(string actionName, int bindingIndex = 0) { var instance = Instance; @@ -678,7 +708,13 @@ using Cysharp.Threading.Tasks; } - // choose best binding index for keyboard; if compositePartName != null then look for part + // 为键盘选择最佳绑定索引;如果 compositePartName != null 则查找部分 + /// + /// 为键盘查找最佳的绑定索引 + /// + /// 输入操作 + /// 复合部分名称(可选) + /// 绑定索引,未找到则返回 -1 public int FindBestBindingIndexForKeyboard(InputAction action, string compositePartName = null) { if (action == null) return -1; @@ -691,14 +727,14 @@ using Cysharp.Threading.Tasks; { var b = action.bindings[i]; - // If searching for a specific composite part, skip non-matching bindings + // 如果搜索特定的复合部分,跳过不匹配的绑定 if (searchingForCompositePart) { if (!b.isPartOfComposite) continue; if (!string.Equals(b.name, compositePartName, StringComparison.OrdinalIgnoreCase)) continue; } - // Check if this binding is for keyboard + // 检查此绑定是否用于键盘 bool isKeyboardBinding = (!string.IsNullOrEmpty(b.path) && b.path.StartsWith(KEYBOARD_DEVICE, StringComparison.OrdinalIgnoreCase)) || (!string.IsNullOrEmpty(b.effectivePath) && b.effectivePath.StartsWith(KEYBOARD_DEVICE, StringComparison.OrdinalIgnoreCase)); diff --git a/Client/Assets/InputGlyph/InputGlyphDatabase.cs b/Client/Assets/InputGlyph/InputGlyphDatabase.cs index 81ad70c..d5879d3 100644 --- a/Client/Assets/InputGlyph/InputGlyphDatabase.cs +++ b/Client/Assets/InputGlyph/InputGlyphDatabase.cs @@ -37,15 +37,21 @@ public sealed class InputGlyphDatabase : ScriptableObject // 当 FindEntryByControlPath 传空 path 时返回的占位 sprite public Sprite placeholderSprite; - // Cache for faster lookups + // 用于更快查找的缓存 private Dictionary _tableCache; private Dictionary<(string path, InputDeviceWatcher.InputDeviceCategory device), Sprite> _spriteCache; + /// + /// 启用时构建缓存 + /// private void OnEnable() { BuildCache(); } + /// + /// 构建表和精灵的查找缓存 + /// private void BuildCache() { if (_tableCache == null) @@ -76,18 +82,23 @@ public sealed class InputGlyphDatabase : ScriptableObject } } + /// + /// 根据设备名称获取设备图标表 + /// + /// 设备名称 + /// 设备图标表 public DeviceGlyphTable GetTable(string deviceName) { if (string.IsNullOrEmpty(deviceName)) return null; if (tables == null) return null; - // Ensure cache is built + // 确保缓存已构建 if (_tableCache == null || _tableCache.Count == 0) { BuildCache(); } - // Use cache for O(1) lookup + // 使用缓存进行 O(1) 查找 if (_tableCache.TryGetValue(deviceName.ToLowerInvariant(), out var table)) { return table; @@ -96,6 +107,11 @@ public sealed class InputGlyphDatabase : ScriptableObject return null; } + /// + /// 获取平台图标 + /// + /// 设备类型 + /// 平台图标 Sprite public Sprite GetPlatformIcon(InputDeviceWatcher.InputDeviceCategory device) { var table = GetTable(device); @@ -103,9 +119,14 @@ public sealed class InputGlyphDatabase : ScriptableObject return table.platformIcons; } + /// + /// 根据设备类型获取设备图标表 + /// + /// 设备类型 + /// 设备图标表 public DeviceGlyphTable GetTable(InputDeviceWatcher.InputDeviceCategory device) { - // Use constants to avoid string allocations + // 使用常量避免字符串分配 string name; switch (device) { @@ -126,6 +147,12 @@ public sealed class InputGlyphDatabase : ScriptableObject return GetTable(name); } + /// + /// 根据控制路径和设备类型查找 Sprite + /// + /// 控制路径 + /// 设备类型 + /// 找到的 Sprite,未找到则返回占位 Sprite public Sprite FindSprite(string controlPath, InputDeviceWatcher.InputDeviceCategory device) { if (string.IsNullOrEmpty(controlPath)) @@ -133,7 +160,7 @@ public sealed class InputGlyphDatabase : ScriptableObject return placeholderSprite; } - // Check cache first + // 首先检查缓存 var cacheKey = (controlPath, device); if (_spriteCache != null && _spriteCache.TryGetValue(cacheKey, out var cachedSprite)) { @@ -143,7 +170,7 @@ public sealed class InputGlyphDatabase : ScriptableObject var entry = FindEntryByControlPath(controlPath, device); var sprite = entry?.Sprite ?? placeholderSprite; - // Cache the result (including null results to avoid repeated lookups) + // 缓存结果(包括 null 结果以避免重复查找) if (_spriteCache != null) { _spriteCache[cacheKey] = sprite; @@ -152,6 +179,12 @@ public sealed class InputGlyphDatabase : ScriptableObject return sprite; } + /// + /// 根据控制路径和设备类型查找图标条目 + /// + /// 控制路径 + /// 设备类型 + /// 找到的图标条目,未找到则返回 null public GlyphEntry FindEntryByControlPath(string controlPath, InputDeviceWatcher.InputDeviceCategory device) { var t = GetTable(device); diff --git a/Client/Assets/InputGlyph/InputGlyphDatabaseEditor.cs b/Client/Assets/InputGlyph/InputGlyphDatabaseEditor.cs index ea71041..21ba557 100644 --- a/Client/Assets/InputGlyph/InputGlyphDatabaseEditor.cs +++ b/Client/Assets/InputGlyph/InputGlyphDatabaseEditor.cs @@ -17,7 +17,7 @@ public class InputGlyphDatabaseEditor : Editor List searchStrings = new List(); List currentPages = new List(); - // per-table temporary fields for adding single entry (only sprite now) + // 每个表的临时字段,用于添加单个条目(目前仅支持 sprite) List newEntrySprites = new List(); const int itemsPerPage = 10; @@ -174,7 +174,7 @@ public class InputGlyphDatabaseEditor : Editor EditorGUILayout.BeginVertical("box"); if (tabIndex == tablesProp.arraySize) { - // Settings + // 设置 EditorGUILayout.LabelField("Settings", EditorStyles.boldLabel); EditorGUILayout.Space(4); EditorGUILayout.PropertyField(placeholderSpriteProp, new GUIContent("Placeholder Sprite")); @@ -205,7 +205,7 @@ public class InputGlyphDatabaseEditor : Editor EnsureEditorListsLength(); - // compute deviceName & runtime index for this table (used when deleting single entry) + // 计算此表的 deviceName 和运行时索引(用于删除单个条目时) var nameProp = tableProp.FindPropertyRelative("deviceName"); string deviceName = nameProp != null ? nameProp.stringValue : ""; int runtimeTableIndex = MapSerializedTableToRuntimeIndex(deviceName); @@ -356,10 +356,10 @@ public class InputGlyphDatabaseEditor : Editor var eProp = entries.GetArrayElementAtIndex(i); if (eProp == null) continue; - // display one entry with a small remove button on the right + // 显示一个条目,右侧带有小的删除按钮 using (new EditorGUILayout.HorizontalScope("box")) { - // left: preview column + // 左侧:预览列 using (new EditorGUILayout.VerticalScope(GUILayout.Width(80))) { var spriteProp = eProp.FindPropertyRelative("Sprite"); @@ -385,14 +385,14 @@ public class InputGlyphDatabaseEditor : Editor } } - // middle: action column + // 中间:操作列 EditorGUILayout.BeginVertical(); var actionProp = eProp.FindPropertyRelative("action"); EditorGUILayout.Space(2); EditorGUILayout.PropertyField(actionProp, GUIContent.none, GUILayout.ExpandWidth(true)); EditorGUILayout.EndVertical(); - // right: small remove button + // 右侧:小的删除按钮 GUILayout.Space(6); if (GUILayout.Button("×", EditorStyles.toolbarButton, GUILayout.Width(24))) { @@ -403,16 +403,16 @@ public class InputGlyphDatabaseEditor : Editor if (EditorUtility.DisplayDialog("Remove Entry?", $"Remove entry '{(string.IsNullOrEmpty(spriteName) ? "" : spriteName)}' from table '{deviceName}'?", "Remove", "Cancel")) { - // remove from serialized array + // 从序列化数组中移除 var entriesProp = tableProp.FindPropertyRelative("entries"); if (entriesProp != null && i >= 0 && i < entriesProp.arraySize) { entriesProp.DeleteArrayElementAtIndex(i); - // apply then remove from runtime to keep both in sync + // 应用后从运行时移除以保持两者同步 serializedObject.ApplyModifiedProperties(); } - // remove from runtime list (db.tables) + // 从运行时列表中移除(db.tables) if (runtimeTableIndex >= 0 && db != null && db.tables != null && runtimeTableIndex < db.tables.Count) { var runtimeTable = db.tables[runtimeTableIndex]; @@ -425,7 +425,7 @@ public class InputGlyphDatabaseEditor : Editor EditorUtility.SetDirty(db); AssetDatabase.SaveAssets(); - // reset paging and return to avoid continuing to iterate mutated serialized array + // 重置分页并返回,避免继续迭代已变更的序列化数组 currentPages[tabIndex] = 0; return; } @@ -514,7 +514,7 @@ public class InputGlyphDatabaseEditor : Editor if (spriteProp != null) spriteProp.objectReferenceValue = sprite; - // leave action serialized as-is (most projects can't serialize InputAction directly here) + // 保持 action 序列化不变(大多数项目无法在此处直接序列化 InputAction) if (actionProp != null) { try @@ -529,7 +529,7 @@ public class InputGlyphDatabaseEditor : Editor serializedObject.ApplyModifiedProperties(); - // also add to runtime list + // 同时添加到运行时列表 var nameProp = tableProp.FindPropertyRelative("deviceName"); string deviceName = nameProp != null ? nameProp.stringValue : ""; int tableIndex = MapSerializedTableToRuntimeIndex(deviceName); diff --git a/Client/Assets/InputGlyph/InputGlyphImage.cs b/Client/Assets/InputGlyph/InputGlyphImage.cs index d237fe6..4696938 100644 --- a/Client/Assets/InputGlyph/InputGlyphImage.cs +++ b/Client/Assets/InputGlyph/InputGlyphImage.cs @@ -12,6 +12,9 @@ public sealed class InputGlyphImage : MonoBehaviour private InputDeviceWatcher.InputDeviceCategory _cachedCategory; private Sprite _cachedSprite; + /// + /// 启用时初始化组件并订阅设备变更事件 + /// void OnEnable() { if (targetImage == null) targetImage = GetComponent(); @@ -20,11 +23,17 @@ public sealed class InputGlyphImage : MonoBehaviour UpdatePrompt(); } + /// + /// 禁用时取消订阅设备变更事件 + /// void OnDisable() { InputDeviceWatcher.OnDeviceChanged -= OnDeviceChanged; } + /// + /// 设备类型变更时的回调,更新图标显示 + /// void OnDeviceChanged(InputDeviceWatcher.InputDeviceCategory cat) { if (_cachedCategory != cat) @@ -34,11 +43,14 @@ public sealed class InputGlyphImage : MonoBehaviour } } + /// + /// 更新输入提示图标,并根据配置控制目标对象的显示/隐藏 + /// void UpdatePrompt() { if (actionReference == null || actionReference.action == null || targetImage == null) return; - // Use cached category instead of re-querying CurrentCategory + // 使用缓存的设备类型,避免重复查询 CurrentCategory if (GlyphService.TryGetUISpriteForActionPath(actionReference, "", _cachedCategory, out Sprite sprite)) { if (_cachedSprite != sprite) diff --git a/Client/Assets/InputGlyph/InputGlyphText.cs b/Client/Assets/InputGlyph/InputGlyphText.cs index 078088f..577140b 100644 --- a/Client/Assets/InputGlyph/InputGlyphText.cs +++ b/Client/Assets/InputGlyph/InputGlyphText.cs @@ -14,6 +14,9 @@ public sealed class InputGlyphText : MonoBehaviour private InputDeviceWatcher.InputDeviceCategory _cachedCategory; private string _cachedFormattedText; + /// + /// 启用时初始化组件并订阅设备变更事件 + /// void OnEnable() { if (textField == null) textField = GetComponent(); @@ -23,11 +26,17 @@ public sealed class InputGlyphText : MonoBehaviour UpdatePrompt(); } + /// + /// 禁用时取消订阅设备变更事件 + /// void OnDisable() { InputDeviceWatcher.OnDeviceChanged -= OnDeviceChanged; } + /// + /// 设备类型变更时的回调,更新文本显示 + /// void OnDeviceChanged(InputDeviceWatcher.InputDeviceCategory cat) { if (_cachedCategory != cat) @@ -37,11 +46,14 @@ public sealed class InputGlyphText : MonoBehaviour } } + /// + /// 更新文本中的输入提示标签,使用 TextMeshPro 的 sprite 标签或文本回退 + /// void UpdatePrompt() { if (actionReference == null || actionReference.action == null || textField == null) return; - // Use cached category instead of re-querying CurrentCategory + // 使用缓存的设备类型,避免重复查询 CurrentCategory if (GlyphService.TryGetTMPTagForActionPath(actionReference, "", _cachedCategory, out string tag, out string displayFallback)) { string formattedText = Utility.Text.Format(_oldText, tag); diff --git a/Client/Assets/InputGlyph/InputGlyphUXButton.cs b/Client/Assets/InputGlyph/InputGlyphUXButton.cs index 9aa1b9c..b119273 100644 --- a/Client/Assets/InputGlyph/InputGlyphUXButton.cs +++ b/Client/Assets/InputGlyph/InputGlyphUXButton.cs @@ -13,6 +13,9 @@ public sealed class InputGlyphUXButton : MonoBehaviour private Sprite _cachedSprite; #if UNITY_EDITOR + /// + /// 编辑器验证,自动获取 UXButton 组件 + /// private void OnValidate() { if (button == null) @@ -22,6 +25,9 @@ public sealed class InputGlyphUXButton : MonoBehaviour } #endif + /// + /// 启用时初始化组件并订阅设备变更事件 + /// void OnEnable() { if (button == null) button = GetComponent(); @@ -32,11 +38,17 @@ public sealed class InputGlyphUXButton : MonoBehaviour UpdatePrompt(); } + /// + /// 禁用时取消订阅设备变更事件 + /// void OnDisable() { InputDeviceWatcher.OnDeviceChanged -= OnDeviceChanged; } + /// + /// 设备类型变更时的回调,更新图标显示 + /// void OnDeviceChanged(InputDeviceWatcher.InputDeviceCategory cat) { if (_cachedCategory != cat) @@ -46,11 +58,14 @@ public sealed class InputGlyphUXButton : MonoBehaviour } } + /// + /// 更新按钮的输入提示图标 + /// void UpdatePrompt() { if (_actionReference == null || _actionReference.action == null || targetImage == null) return; - // Use cached category instead of re-querying CurrentCategory + // 使用缓存的设备类型,避免重复查询 CurrentCategory if (GlyphService.TryGetUISpriteForActionPath(_actionReference, "", _cachedCategory, out Sprite sprite)) { if (_cachedSprite != sprite) diff --git a/Client/Assets/InputGlyph/TestRebindScript.cs b/Client/Assets/InputGlyph/TestRebindScript.cs index 95045ad..a2de64e 100644 --- a/Client/Assets/InputGlyph/TestRebindScript.cs +++ b/Client/Assets/InputGlyph/TestRebindScript.cs @@ -21,6 +21,9 @@ public class TestRebindScript : MonoBehaviour [Header("Behavior")] [Tooltip("如果 true,在 Prepare 后自动调用 ConfirmApply() 并保存;否则等待手动 ConfirmPrepared()/CancelPrepared()")] public bool autoConfirm = false; + /// + /// 启动时初始化并订阅事件 + /// private void Start() { if (btn != null) btn.onClick.AddListener(OnBtnClicked); @@ -29,7 +32,7 @@ public class TestRebindScript : MonoBehaviour if (InputBindingManager.Instance != null) { - // Subscribe to events + // 订阅事件 InputBindingManager.Instance.OnRebindPrepare += OnRebindPrepareHandler; InputBindingManager.Instance.OnApply += OnApplyHandler; InputBindingManager.Instance.OnRebindEnd += OnRebindEndHandler; @@ -37,6 +40,9 @@ public class TestRebindScript : MonoBehaviour } } + /// + /// 禁用时取消订阅事件 + /// private void OnDisable() { if (btn != null) btn.onClick.RemoveListener(OnBtnClicked); @@ -51,6 +57,9 @@ public class TestRebindScript : MonoBehaviour } } + /// + /// 重新绑定准备完成的处理器 + /// private void OnRebindPrepareHandler(InputBindingManager.RebindContext ctx) { if (IsTargetContext(ctx)) @@ -61,11 +70,14 @@ public class TestRebindScript : MonoBehaviour } } + /// + /// 应用重新绑定的处理器 + /// private void OnApplyHandler(bool success, HashSet appliedContexts) { if (appliedContexts != null) { - // Only update if any of the applied/discarded contexts match this instance + // 仅当任何应用/丢弃的上下文与此实例匹配时才更新 foreach (var ctx in appliedContexts) { if (IsTargetContext(ctx)) @@ -77,6 +89,9 @@ public class TestRebindScript : MonoBehaviour } } + /// + /// 重新绑定结束的处理器 + /// private void OnRebindEndHandler(bool success, InputBindingManager.RebindContext context) { if (IsTargetContext(context)) @@ -85,64 +100,84 @@ public class TestRebindScript : MonoBehaviour } } + /// + /// 重新绑定冲突的处理器 + /// private void OnRebindConflictHandler(InputBindingManager.RebindContext prepared, InputBindingManager.RebindContext conflict) { - // Update if either the prepared or conflict context matches this instance + // 如果准备的或冲突的上下文匹配此实例,则更新 if (IsTargetContext(prepared) || IsTargetContext(conflict)) { UpdateBindingText(); } } + /// + /// 设备变更的回调 + /// private void OnDeviceChanged(InputDeviceWatcher.InputDeviceCategory _) { UpdateBindingText(); } + /// + /// 获取当前的输入操作 + /// private InputAction GetAction() { return InputBindingManager.Action(actionName); } - + /// + /// 判断上下文是否为目标上下文 + /// private bool IsTargetContext(InputBindingManager.RebindContext ctx) { if (ctx == null || ctx.action == null) return false; var action = GetAction(); if (action == null) return false; - // Must match the action + // 必须匹配操作 if (ctx.action != action) return false; - // If we have a composite part specified, we need to match the binding index + // 如果指定了复合部分,需要匹配绑定索引 if (!string.IsNullOrEmpty(compositePartName)) { - // Get the binding at the context's index + // 获取上下文索引处的绑定 if (ctx.bindingIndex < 0 || ctx.bindingIndex >= action.bindings.Count) return false; var binding = action.bindings[ctx.bindingIndex]; - // Check if the binding's name matches our composite part + // 检查绑定的名称是否与我们的复合部分匹配 return string.Equals(binding.name, compositePartName, StringComparison.OrdinalIgnoreCase); } - // If no composite part specified, just matching the action is enough + // 如果未指定复合部分,仅匹配操作就足够了 return true; } + /// + /// 按钮点击的回调 + /// private void OnBtnClicked() { - // Use manager API (we pass part name so manager can pick proper binding if needed) + // 使用管理器 API(我们传递部分名称,以便管理器可以在需要时选择适当的绑定) InputBindingManager.StartRebind(actionName, string.IsNullOrEmpty(compositePartName) ? null : compositePartName); } + /// + /// 确认准备好的重新绑定(公共方法) + /// public async void ConfirmPrepared() { bool ok = await ConfirmPreparedAsync(); if (!ok) Debug.LogError("ConfirmPrepared: apply failed."); } + /// + /// 确认准备好的重新绑定(异步) + /// private async Task ConfirmPreparedAsync() { try @@ -157,12 +192,18 @@ public class TestRebindScript : MonoBehaviour } } + /// + /// 取消准备好的重新绑定 + /// public void CancelPrepared() { InputBindingManager.DiscardPrepared(); - // UpdateBindingText will be called automatically via OnApply event + // UpdateBindingText 将通过 OnApply 事件自动调用 } + /// + /// 更新绑定文本和图标显示 + /// private void UpdateBindingText() { var action = GetAction(); diff --git a/Client/Assets/Test.meta b/Client/Assets/Test.meta new file mode 100644 index 0000000..b21a43e --- /dev/null +++ b/Client/Assets/Test.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 120be4f03dcf52a4c827a44807402f14 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/Assets/Test/GameBase.dll.bytes b/Client/Assets/Test/GameBase.dll.bytes new file mode 100644 index 0000000000000000000000000000000000000000..6a37b711c13f813d9b00c4e6d2ad69abb07effcb GIT binary patch literal 5120 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 R^wGXA20tYlD?SC3{s*4^DYF0o literal 0 HcmV?d00001 diff --git a/Client/Assets/Test/GameBase.pdb.bytes.meta b/Client/Assets/Test/GameBase.pdb.bytes.meta new file mode 100644 index 0000000..5e510a2 --- /dev/null +++ b/Client/Assets/Test/GameBase.pdb.bytes.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d7fad1223ee359940a43eccb1814103f +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/Assets/Test/GameLib.dll.bytes b/Client/Assets/Test/GameLib.dll.bytes new file mode 100644 index 0000000000000000000000000000000000000000..dbb4ce4b963c27e44370713cc546de3b9e4bc3a9 GIT binary patch literal 5120 zcmeHLZ)_Y#6@R;TzSvIV#t8{&8`4eUl0R6-o%ihXB~9@CwU5}f<+IZi8994*6KCn( z?sa$1jUxiC_){nKH1~R@qkr+$>=HvaEta&Lu))pJP-0*J(qRMJQ$X zo#xIM(dBR)vuova0ORZ-qPaEUf6>v1y4RU?gP&N($9-|m2mf|22y`;m+vbP(blmma z8q^Zo7&;tiAL_a?2J~@PSPl$%$>=mH``U)Ou8a}o*0HjCf!7slHfZCt4oGN%OaHTx{hN|_TL;q5A z+8L}DFLw_rhG14A#7CT7UQ0Gz-!crYL_b$q&KuoOPeo$%jHJ8NV&r~02a_26R{aL# zMM;0Byp8@ZBCn}2dQmwQ>7}nLSJYk_RGGe_{1x)&l-JZg`iGK%RHUPqxd4DG$l*vLKUfo1k5kcAJm|p1B8AmU-Ls zS1L}+t%-4A3)k>PJ?nX*QMFd49NVeXT(jxVtu%$VxSXWL#foqEW-aTw#!4AuSyM63 zi(^Thh6|%ZiQMqeP&%1PX4A!zt{3x(yk064)1#?Ov8X3g#X>eWl+g3}OnO956%M!=w(HYlV2F`M$X^Dog8IWTagm0LZcbxK>0{jl8Ml!i< zB9qP(M$`FHaX4Sf4dq5tqeFT+JyOhOb9xDAl6p=r7E8k;dNMl-(4|tAWUvLpH>hM< zV#e^#dXnobhh)c%hL|*~)bMJKYoRmSvVF55N~W;t6NX*41j*Gc)=l4W<9WvwK?sz! z%$j-LI2E5S$HP%{(y&^Br>4L@=Q>Y&M%5C$;DYi_qX{%_CrLhTs%i_WHBlZP(d?Rd z-d+~2dB$WP8#SCa)3A`WX}f6q!kw`UBzyhff~dBZmUw8#;cd7&ii)VUTx_Em;WkXq zLozzL0JqH0tgwu8vgdX5VfbtYRn@fMr=!iSAim0q=Zgl`uhDdDq??giG%J=&$la`E zQJ9K&9sR(X+L*F6-W(ktby08vU%Z+$U!KCg34FP7LkA1Pnpxr9NfECho9i>%c3v=z zCEM|EI=r?hj80;;LNwyl-hUCJxqo7#)Z4<0!_erd-OZ#@6$KR!oMO;Nfd z8Yx}q^!H1;L()TCnyU2mMK>w^yEl=lY%BJcyT5;a;p79U>t9^G6jxS18)oZHpyO>} zCy=#N4{GgmG^m|KL`d2({$As6P|LS0zvYT!wrKgTVGU|CttyVt39&NgJSpsB)pXhz zt__bQGkQuSMl(B6A#UUqc;;#6Hla#=6y*ikq~5H@>Axw-Ua} z_V8zKPTl#qYcwBo?BcnaXz~V{JIlwB?c_(2qI{czlb0%`aed399`D={;i<&I@5svb z8D~w7S9MT6^S2kiL(0?)dp?7D4R6Y8{7483&#@i#0O~$`7xu}=T&P4NpRpa5W-Eot z>ep`Ecm2CR8vnx0XD=l#zB9`{#*ZvWkTb5sn`I%qg%vU>Y)Yxh5>%? z`SKPf9RG}Yt{p(TjpL-=EAPGn{1PPEMYOunHrW4o&;5s-?fAFDsWGBLaAa77ehTy? zRcH~kNVDjb@k{G5@MX|a@T-e{7=7y|zk_Zs9|;Bg23qGVv$lqX^9!n%VcftO^b;`auA!6`BtU)tKhZehI)YJkVt4ttaE zQN`FgwEX+#pu{u@nPhlP{*YI=}^v*v;Q_e=I%aEO2#vT@eby0 zA#NX;*ceqO9*&J;;&*QraeJ_A0JjBX+PjX!(0k>*UI8umKZDCh-s_3(`Tu`hfqw%f CKNfNT literal 0 HcmV?d00001 diff --git a/Client/Assets/Test/GameLib.dll.bytes.meta b/Client/Assets/Test/GameLib.dll.bytes.meta new file mode 100644 index 0000000..2b7fc7c --- /dev/null +++ b/Client/Assets/Test/GameLib.dll.bytes.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 66312dfa5dc7a594fa239d5e23983099 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/Assets/Test/GameLib.pdb.bytes b/Client/Assets/Test/GameLib.pdb.bytes new file mode 100644 index 0000000000000000000000000000000000000000..d6d2b6fef496b5b9be111fbeeaf2cc335bd7a0f0 GIT binary patch literal 18432 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 literal 0 HcmV?d00001 diff --git a/Client/Assets/Test/GameLogic.dll.bytes.meta b/Client/Assets/Test/GameLogic.dll.bytes.meta new file mode 100644 index 0000000..7a44ef8 --- /dev/null +++ b/Client/Assets/Test/GameLogic.dll.bytes.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: ca9087bc37b3f8d48b90396b79b283f3 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Client/Assets/Test/GameLogic.pdb.bytes b/Client/Assets/Test/GameLogic.pdb.bytes new file mode 100644 index 0000000000000000000000000000000000000000..faaa3851705790f0dfb709087c35a87d09dd0b9a GIT binary patch literal 24296 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