diff --git a/Client/Assets/Scripts/CustomeModule/InputGlyph/InputActionReader.cs b/Client/Assets/Scripts/CustomeModule/InputGlyph/InputActionReader.cs new file mode 100644 index 0000000..8fa26c9 --- /dev/null +++ b/Client/Assets/Scripts/CustomeModule/InputGlyph/InputActionReader.cs @@ -0,0 +1,221 @@ +using System; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.InputSystem; + +public static class InputActionReader +{ + private readonly struct InputReadKey : IEquatable + { + public readonly string ActionName; + public readonly int OwnerId; + public readonly string OwnerKey; + + public InputReadKey(string actionName, int ownerId) + { + ActionName = actionName ?? string.Empty; + OwnerId = ownerId; + OwnerKey = string.Empty; + } + + public InputReadKey(string actionName, string ownerKey) + { + ActionName = actionName ?? string.Empty; + OwnerId = 0; + OwnerKey = ownerKey ?? string.Empty; + } + + public bool Equals(InputReadKey other) + { + return OwnerId == other.OwnerId + && string.Equals(ActionName, other.ActionName, StringComparison.Ordinal) + && string.Equals(OwnerKey, other.OwnerKey, StringComparison.Ordinal); + } + + public override bool Equals(object obj) + { + return obj is InputReadKey other && Equals(other); + } + + public override int GetHashCode() + { + unchecked + { + int hashCode = 17; + hashCode = (hashCode * 31) + OwnerId; + hashCode = (hashCode * 31) + StringComparer.Ordinal.GetHashCode(ActionName); + hashCode = (hashCode * 31) + StringComparer.Ordinal.GetHashCode(OwnerKey); + return hashCode; + } + } + } + + private static readonly HashSet PressedKeys = new(); + private static readonly HashSet ToggledKeys = new(); + + public static T ReadValue(string actionName) where T : struct + { + return ResolveAction(actionName).ReadValue(); + } + + public static object ReadValue(string actionName) + { + return ResolveAction(actionName).ReadValueAsObject(); + } + + public static bool TryReadValue(string actionName, out T value) where T : struct + { + InputAction inputAction = ResolveAction(actionName); + if (inputAction.IsPressed()) + { + value = inputAction.ReadValue(); + return true; + } + + value = default; + return false; + } + + public static bool TryReadValue(string actionName, out object value) + { + InputAction inputAction = ResolveAction(actionName); + if (inputAction.IsPressed()) + { + value = inputAction.ReadValueAsObject(); + return true; + } + + value = default; + return false; + } + + public static bool TryReadValueOnce(UnityEngine.Object owner, string actionName, out T value) where T : struct + { + if (owner == null) + { + value = default; + return false; + } + + return TryReadValueOnceInternal(new InputReadKey(actionName, owner.GetInstanceID()), actionName, out value); + } + + public static bool ReadButton(string actionName) + { + InputAction inputAction = ResolveAction(actionName); + if (inputAction.type == InputActionType.Button) + { + return Convert.ToBoolean(inputAction.ReadValueAsObject()); + } + + throw new NotSupportedException("[InputActionReader] The Input Action must be a button type."); + } + + public static bool ReadButtonOnce(UnityEngine.Object owner, string actionName) + { + return owner != null && ReadButtonOnce(owner.GetInstanceID(), actionName); + } + + public static bool ReadButtonOnce(int instanceID, string actionName) + { + return ReadButtonOnceInternal(new InputReadKey(actionName, instanceID), actionName); + } + + public static bool ReadButtonOnce(string key, string actionName) + { + return ReadButtonOnceInternal(new InputReadKey(actionName, key), actionName); + } + + public static bool ReadButtonToggle(UnityEngine.Object owner, string actionName) + { + return owner != null && ReadButtonToggle(owner.GetInstanceID(), actionName); + } + + public static bool ReadButtonToggle(int instanceID, string actionName) + { + return ReadButtonToggleInternal(new InputReadKey(actionName, instanceID), actionName); + } + + public static bool ReadButtonToggle(string key, string actionName) + { + return ReadButtonToggleInternal(new InputReadKey(actionName, key), actionName); + } + + public static void ResetToggledButton(string key, string actionName) + { + ToggledKeys.Remove(new InputReadKey(actionName, key)); + } + + public static void ResetToggledButton(string actionName) + { + if (string.IsNullOrEmpty(actionName) || ToggledKeys.Count == 0) + { + return; + } + + InputReadKey[] snapshot = new InputReadKey[ToggledKeys.Count]; + ToggledKeys.CopyTo(snapshot); + for (int i = 0; i < snapshot.Length; i++) + { + if (string.Equals(snapshot[i].ActionName, actionName, StringComparison.Ordinal)) + { + ToggledKeys.Remove(snapshot[i]); + } + } + } + + public static void ResetToggledButtons() + { + ToggledKeys.Clear(); + } + + private static InputAction ResolveAction(string actionName) + { + return InputBindingManager.Action(actionName) + ?? throw new InvalidOperationException($"[InputActionReader] Action '{actionName}' is not available."); + } + + private static bool TryReadValueOnceInternal(InputReadKey readKey, string actionName, out T value) where T : struct + { + InputAction inputAction = ResolveAction(actionName); + if (inputAction.IsPressed()) + { + if (PressedKeys.Add(readKey)) + { + value = inputAction.ReadValue(); + return true; + } + } + else + { + PressedKeys.Remove(readKey); + } + + value = default; + return false; + } + + private static bool ReadButtonOnceInternal(InputReadKey readKey, string actionName) + { + if (ReadButton(actionName)) + { + return PressedKeys.Add(readKey); + } + + PressedKeys.Remove(readKey); + return false; + } + + private static bool ReadButtonToggleInternal(InputReadKey readKey, string actionName) + { + if (ReadButtonOnceInternal(readKey, actionName)) + { + if (!ToggledKeys.Add(readKey)) + { + ToggledKeys.Remove(readKey); + } + } + + return ToggledKeys.Contains(readKey); + } +} diff --git a/Client/Assets/Scripts/CustomeModule/InputGlyph/InputActionReader.cs.meta b/Client/Assets/Scripts/CustomeModule/InputGlyph/InputActionReader.cs.meta new file mode 100644 index 0000000..3dddf32 --- /dev/null +++ b/Client/Assets/Scripts/CustomeModule/InputGlyph/InputActionReader.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: b9368556ed4729ae618e0a19d3a7925b +timeCreated: 1773811724 diff --git a/Client/Assets/Scripts/CustomeModule/InputGlyph/InputBindingManager.cs b/Client/Assets/Scripts/CustomeModule/InputGlyph/InputBindingManager.cs index e02a02f..dca7960 100644 --- a/Client/Assets/Scripts/CustomeModule/InputGlyph/InputBindingManager.cs +++ b/Client/Assets/Scripts/CustomeModule/InputGlyph/InputBindingManager.cs @@ -1,8 +1,6 @@ using System; using System.IO; -using System.Linq; using System.Collections.Generic; -using System.Threading.Tasks; using UnityEngine; using UnityEngine.InputSystem; using AlicizaX; @@ -24,16 +22,15 @@ public class InputBindingManager : MonoSingleton public string fileName = "input_bindings.json"; public bool debugMode = false; - public Dictionary actionMap = new Dictionary(); - public HashSet preparedRebinds = new HashSet(); - internal InputActionRebindingExtensions.RebindingOperation rebindOperation; private bool isApplyPending = false; private string defaultBindingsJson = string.Empty; private string cachedSavePath; - private Dictionary actionLookup = new Dictionary(); - - // 用于替代 Rx.NET Subjects 的事件 + private readonly Dictionary actionMap = new(StringComparer.Ordinal); + private readonly HashSet preparedRebinds = new(); + private readonly Dictionary actionLookup = new(StringComparer.Ordinal); + private readonly Dictionary actionLookupById = new(); + private readonly HashSet ambiguousActionNames = new(StringComparer.Ordinal); private event Action _onInputsInit; public event Action OnInputsInit @@ -59,6 +56,9 @@ public class InputBindingManager : MonoSingleton private bool isInputsInitialized = false; + public IReadOnlyDictionary ActionMaps => actionMap; + public IReadOnlyCollection PreparedRebinds => preparedRebinds; + public string SavePath { get @@ -160,38 +160,48 @@ public class InputBindingManager : MonoSingleton private void BuildActionMap() { - // 预分配已知容量以避免调整大小 - int mapCount = actions.actionMaps.Count; actionMap.Clear(); actionLookup.Clear(); - - // 估算总操作数以便更好地分配内存 - int estimatedActionCount = 0; - foreach (var map in actions.actionMaps) - { - estimatedActionCount += map.actions.Count; - } - - // 确保容量以避免重新哈希 - if (actionMap.Count == 0) - { - actionMap = new Dictionary(mapCount); - actionLookup = new Dictionary(estimatedActionCount); - } + actionLookupById.Clear(); + ambiguousActionNames.Clear(); foreach (var map in actions.actionMaps) { var actionMapObj = new ActionMap(map); actionMap.Add(map.name, actionMapObj); - // 构建查找字典以实现 O(1) 操作访问 foreach (var actionPair in actionMapObj.actions) { - actionLookup[actionPair.Key] = (actionMapObj, actionPair.Value); + RegisterActionLookup(map.name, actionPair.Key, actionMapObj, actionPair.Value); } } } + private void RegisterActionLookup(string mapName, string actionName, ActionMap map, ActionMap.Action action) + { + actionLookupById[action.action.id] = (map, action); + actionLookup[$"{mapName}/{actionName}"] = (map, action); + + if (ambiguousActionNames.Contains(actionName)) + { + return; + } + + if (actionLookup.TryGetValue(actionName, out var existing)) + { + if (existing.action.action != action.action) + { + actionLookup.Remove(actionName); + ambiguousActionNames.Add(actionName); + Debug.LogWarning($"[InputBindingManager] Duplicate action name '{actionName}' detected. Use 'MapName/{actionName}' to resolve it."); + } + + return; + } + + actionLookup[actionName] = (map, action); + } + private void RefreshBindingPathsFromActions() { foreach (var mapPair in actionMap.Values) @@ -346,16 +356,26 @@ public class InputBindingManager : MonoSingleton { if (obj is not RebindContext other) return false; if (action == null || other.action == null) return false; - return action.name == other.action.name && bindingIndex == other.bindingIndex; + return action.id == other.action.id && bindingIndex == other.bindingIndex; } - public override int GetHashCode() => (action?.name ?? string.Empty, bindingIndex).GetHashCode(); + public override int GetHashCode() + { + unchecked + { + int hashCode = 17; + hashCode = (hashCode * 31) + (action != null ? action.id.GetHashCode() : 0); + hashCode = (hashCode * 31) + bindingIndex; + return hashCode; + } + } public override string ToString() { if (cachedToString == null && action != null) { - cachedToString = $"{action.name}:{bindingIndex}"; + string mapName = action.actionMap != null ? action.actionMap.name : ""; + cachedToString = $"{mapName}/{action.name}:{bindingIndex}"; } return cachedToString ?? ""; @@ -374,15 +394,40 @@ public class InputBindingManager : MonoSingleton var instance = Instance; if (instance == null) return null; - if (instance.actionLookup.TryGetValue(actionName, out var result)) + if (TryGetAction(actionName, out InputAction action)) { - return result.action.action; + return action; + } + + if (instance.ambiguousActionNames.Contains(actionName)) + { + Debug.LogError($"[InputBindingManager] Action name '{actionName}' is ambiguous. Use 'MapName/{actionName}' instead."); + return null; } Debug.LogError($"[InputBindingManager] Could not find action '{actionName}'"); return null; } + public static bool TryGetAction(string actionName, out InputAction action) + { + var instance = Instance; + if (instance == null || string.IsNullOrWhiteSpace(actionName)) + { + action = null; + return false; + } + + if (instance.actionLookup.TryGetValue(actionName, out var result)) + { + action = result.action.action; + return true; + } + + action = null; + return false; + } + /// /// 开始重新绑定指定的输入操作 /// @@ -443,7 +488,7 @@ public class InputBindingManager : MonoSingleton } } - var bp = GetBindingPath(ctx.action.name, ctx.bindingIndex); + var bp = GetBindingPath(ctx.action, ctx.bindingIndex); if (bp != null) { bp.EffectivePath = (ctx.overridePath == NULL_BINDING) ? string.Empty : ctx.overridePath; @@ -607,11 +652,11 @@ public class InputBindingManager : MonoSingleton if (string.IsNullOrEmpty(context.overridePath)) { - var bp = GetBindingPath(context.action.name, context.bindingIndex); + var bp = GetBindingPath(context.action, context.bindingIndex); if (bp != null) context.overridePath = bp.bindingPath; } - var bindingPath = GetBindingPath(context.action.name, context.bindingIndex); + var bindingPath = GetBindingPath(context.action, context.bindingIndex); if (bindingPath == null) return; if (bindingPath.EffectivePath != context.overridePath) @@ -695,17 +740,45 @@ public class InputBindingManager : MonoSingleton var instance = Instance; if (instance == null) return null; - if (instance.actionLookup.TryGetValue(actionName, out var result)) + if (instance.TryGetActionRecord(actionName, out var result) + && result.action.bindings.TryGetValue(bindingIndex, out var binding)) { - if (result.action.bindings.TryGetValue(bindingIndex, out var binding)) - { - return binding.bindingPath; - } + return binding.bindingPath; } return null; } + public static BindingPath GetBindingPath(InputAction action, int bindingIndex = 0) + { + var instance = Instance; + if (instance == null || action == null) return null; + + if (instance.TryGetActionRecord(action, out var result) + && result.action.bindings.TryGetValue(bindingIndex, out var binding)) + { + return binding.bindingPath; + } + + return null; + } + + private bool TryGetActionRecord(string actionName, out (ActionMap map, ActionMap.Action action) result) + { + return actionLookup.TryGetValue(actionName, out result); + } + + private bool TryGetActionRecord(InputAction action, out (ActionMap map, ActionMap.Action action) result) + { + if (action != null && actionLookupById.TryGetValue(action.id, out result)) + { + return result.action.action == action; + } + + result = default; + return false; + } + // 为键盘选择最佳绑定索引;如果 compositePartName != null 则查找部分 /// diff --git a/Client/UserSettings/Layouts/default-2022.dwlt b/Client/UserSettings/Layouts/default-2022.dwlt index 93899b5..db898fb 100644 --- a/Client/UserSettings/Layouts/default-2022.dwlt +++ b/Client/UserSettings/Layouts/default-2022.dwlt @@ -14,16 +14,16 @@ MonoBehaviour: m_EditorClassIdentifier: m_PixelRect: serializedVersion: 2 - x: -4 - y: 51 + x: 0 + y: 43 width: 1920 height: 997 m_ShowMode: 4 - m_Title: Project + m_Title: Console m_RootView: {fileID: 4} m_MinSize: {x: 875, y: 300} m_MaxSize: {x: 10000, y: 10000} - m_Maximized: 0 + m_Maximized: 1 --- !u!114 &2 MonoBehaviour: m_ObjectHideFlags: 52 @@ -34,23 +34,23 @@ MonoBehaviour: m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0} - m_Name: AnimatorControllerTool + m_Name: GameView m_EditorClassIdentifier: m_Children: [] m_Position: serializedVersion: 2 x: 0 y: 566 - width: 614 + width: 338 height: 381 - m_MinSize: {x: 101, y: 121} + m_MinSize: {x: 51, y: 71} m_MaxSize: {x: 4001, y: 4021} - m_ActualView: {fileID: 15} + m_ActualView: {fileID: 14} m_Panes: - {fileID: 14} - {fileID: 15} - m_Selected: 1 - m_LastSelected: 0 + m_Selected: 0 + m_LastSelected: 1 --- !u!114 &3 MonoBehaviour: m_ObjectHideFlags: 52 @@ -70,12 +70,12 @@ MonoBehaviour: serializedVersion: 2 x: 0 y: 0 - width: 614 + width: 338 height: 947 m_MinSize: {x: 100, y: 100} m_MaxSize: {x: 8096, y: 16192} vertical: 1 - controlID: 398 + controlID: 18 draggingID: 0 --- !u!114 &4 MonoBehaviour: @@ -174,7 +174,7 @@ MonoBehaviour: m_MinSize: {x: 400, y: 100} m_MaxSize: {x: 32384, y: 16192} vertical: 0 - controlID: 144 + controlID: 142 draggingID: 0 --- !u!114 &8 MonoBehaviour: @@ -193,7 +193,7 @@ MonoBehaviour: serializedVersion: 2 x: 0 y: 0 - width: 614 + width: 338 height: 566 m_MinSize: {x: 201, y: 221} m_MaxSize: {x: 4001, y: 4021} @@ -219,14 +219,14 @@ MonoBehaviour: - {fileID: 11} m_Position: serializedVersion: 2 - x: 614 + x: 338 y: 0 - width: 363 + width: 382 height: 947 m_MinSize: {x: 100, y: 100} m_MaxSize: {x: 8096, y: 16192} vertical: 1 - controlID: 73 + controlID: 69 draggingID: 0 --- !u!114 &10 MonoBehaviour: @@ -245,7 +245,7 @@ MonoBehaviour: serializedVersion: 2 x: 0 y: 0 - width: 363 + width: 382 height: 409 m_MinSize: {x: 202, y: 221} m_MaxSize: {x: 4002, y: 4021} @@ -271,7 +271,7 @@ MonoBehaviour: serializedVersion: 2 x: 0 y: 409 - width: 363 + width: 382 height: 538 m_MinSize: {x: 102, y: 121} m_MaxSize: {x: 4002, y: 4021} @@ -295,9 +295,9 @@ MonoBehaviour: m_Children: [] m_Position: serializedVersion: 2 - x: 977 + x: 720 y: 0 - width: 369 + width: 416 height: 947 m_MinSize: {x: 232, y: 271} m_MaxSize: {x: 10002, y: 10021} @@ -321,9 +321,9 @@ MonoBehaviour: m_Children: [] m_Position: serializedVersion: 2 - x: 1346 + x: 1136 y: 0 - width: 574 + width: 784 height: 947 m_MinSize: {x: 276, y: 71} m_MaxSize: {x: 4001, y: 4021} @@ -354,7 +354,7 @@ MonoBehaviour: serializedVersion: 2 x: 0 y: 639 - width: 496 + width: 337 height: 360 m_SerializedDataModeController: m_DataMode: 0 @@ -372,7 +372,7 @@ MonoBehaviour: m_ShowGizmos: 0 m_TargetDisplay: 0 m_ClearColor: {r: 0, g: 0, b: 0, a: 0} - m_TargetSize: {x: 2560, y: 1440} + m_TargetSize: {x: 1920, y: 1080} m_TextureFilterMode: 0 m_TextureHideFlags: 61 m_RenderIMGUI: 1 @@ -381,16 +381,16 @@ MonoBehaviour: m_VSyncEnabled: 0 m_Gizmos: 0 m_Stats: 1 - m_SelectedSizes: 05000000000000000000000000000000000000000000000000000000000000000000000000000000 + m_SelectedSizes: 03000000000000000000000000000000000000000000000000000000000000000000000000000000 m_ZoomArea: m_HRangeLocked: 0 m_VRangeLocked: 0 hZoomLockedByDefault: 0 vZoomLockedByDefault: 0 - m_HBaseRangeMin: -1280 - m_HBaseRangeMax: 1280 - m_VBaseRangeMin: -720 - m_VBaseRangeMax: 720 + m_HBaseRangeMin: -960 + m_HBaseRangeMax: 960 + m_VBaseRangeMin: -540 + m_VBaseRangeMax: 540 m_HAllowExceedBaseRangeMin: 1 m_HAllowExceedBaseRangeMax: 1 m_VAllowExceedBaseRangeMin: 1 @@ -408,23 +408,23 @@ MonoBehaviour: serializedVersion: 2 x: 0 y: 21 - width: 496 + width: 337 height: 339 - m_Scale: {x: 0.19375, y: 0.19375} - m_Translation: {x: 248, y: 169.5} + m_Scale: {x: 0.17552084, y: 0.17552084} + m_Translation: {x: 168.5, y: 169.5} m_MarginLeft: 0 m_MarginRight: 0 m_MarginTop: 0 m_MarginBottom: 0 m_LastShownAreaInsideMargins: serializedVersion: 2 - x: -1280 - y: -874.83875 - width: 2560 - height: 1749.6775 + x: -960 + y: -965.6973 + width: 1920 + height: 1931.3947 m_MinimalGUI: 1 - m_defaultScale: 0.19375 - m_LastWindowPixelSize: {x: 496, y: 360} + m_defaultScale: 0.17552084 + m_LastWindowPixelSize: {x: 337, y: 360} m_ClearInEditMode: 1 m_NoCameraWarning: 1 m_LowResolutionForAspectRatios: 01000000000000000000 @@ -450,9 +450,9 @@ MonoBehaviour: m_Tooltip: m_Pos: serializedVersion: 2 - x: -4 - y: 647 - width: 613 + x: 0 + y: 639 + width: 491 height: 360 m_SerializedDataModeController: m_DataMode: 0 @@ -520,9 +520,9 @@ MonoBehaviour: m_Tooltip: m_Pos: serializedVersion: 2 - x: -4 - y: 81 - width: 613 + x: 0 + y: 73 + width: 337 height: 545 m_SerializedDataModeController: m_DataMode: 0 @@ -1114,7 +1114,7 @@ MonoBehaviour: m_Rotation: m_Target: {x: -0.21037178, y: -0.10913931, z: 0.02363893, w: -0.97122556} speed: 2 - m_Value: {x: -0.21037178, y: -0.10913931, z: 0.023638932, w: -0.9712256} + m_Value: {x: -0.2103712, y: -0.10913901, z: 0.023638865, w: -0.9712229} m_Size: m_Target: 1.0281526 speed: 2 @@ -1136,7 +1136,7 @@ MonoBehaviour: m_FarClip: 10000 m_DynamicClip: 1 m_OcclusionCulling: 0 - m_LastSceneViewRotation: {x: -0.08717229, y: 0.89959055, z: -0.21045254, w: -0.3726226} + m_LastSceneViewRotation: {x: -0.21037178, y: -0.10913931, z: 0.02363893, w: -0.97122556} m_LastSceneViewOrtho: 0 m_ReplacementShader: {fileID: 0} m_ReplacementString: @@ -1163,9 +1163,9 @@ MonoBehaviour: m_Tooltip: m_Pos: serializedVersion: 2 - x: 610 - y: 81 - width: 361 + x: 338 + y: 73 + width: 380 height: 388 m_SerializedDataModeController: m_DataMode: 0 @@ -1180,7 +1180,7 @@ MonoBehaviour: m_SceneHierarchy: m_TreeViewState: scrollPos: {x: 0, y: 0} - m_SelectedIDs: d6700000 + m_SelectedIDs: 08700000 m_LastClickedID: 0 m_ExpandedIDs: 28fbffff m_RenameOverlay: @@ -1226,9 +1226,9 @@ MonoBehaviour: m_Tooltip: m_Pos: serializedVersion: 2 - x: 610 - y: 490 - width: 361 + x: 338 + y: 482 + width: 380 height: 517 m_SerializedDataModeController: m_DataMode: 0 @@ -1260,9 +1260,9 @@ MonoBehaviour: m_Tooltip: m_Pos: serializedVersion: 2 - x: 973 - y: 81 - width: 367 + x: 720 + y: 73 + width: 414 height: 926 m_SerializedDataModeController: m_DataMode: 0 @@ -1285,7 +1285,7 @@ MonoBehaviour: m_SkipHidden: 0 m_SearchArea: 2 m_Folders: - - Assets/Plugins/UnityEditorDarkMode + - Assets/YooAsset m_Globs: [] m_OriginalText: m_ImportLogFlags: 0 @@ -1301,7 +1301,7 @@ MonoBehaviour: scrollPos: {x: 0, y: 0} m_SelectedIDs: e48c0000 m_LastClickedID: 36068 - m_ExpandedIDs: 000000007e0200008a0d0000786d00007a6d00007c6d00007e6d0000806d0000826d0000846d0000866d0000886d00008a6d00008c6d00008e6d0000906d0000926d0000946d0000966d0000986d00009a6d00009c6d00009e6d0000a06d0000a26d0000a46d0000a66d0000a86d0000aa6d0000ac6d0000ae6d0000b06d0000b26d0000b46d0000b66d0000b86d0000ba6d0000bc6d0000be6d0000c06d0000c26d0000c46d0000c66d0000c86d0000ca6d0000cc6d0000ce6d0000d06d0000d26d0000d46d0000d66d0000d86d0000da6d0000dc6d0000de6d0000e06d0000e26d0000e46d0000e66d0000e86d0000ea6d0000ec6d0000ee6d0000f06d0000f26d0000f46d0000 + m_ExpandedIDs: 000000007e0200007c6d00007e6d0000806d0000826d0000846d0000866d0000886d00008a6d00008c6d00008e6d0000906d0000926d0000946d0000966d0000986d00009a6d00009c6d00009e6d0000a06d0000a26d0000a46d0000a66d0000a86d0000aa6d0000ac6d0000ae6d0000b06d0000b26d0000b46d0000b66d0000b86d0000ba6d0000bc6d0000be6d0000c06d0000c26d0000c46d0000c66d0000c86d0000ca6d0000cc6d0000ce6d0000d06d0000d26d0000d46d0000d66d0000d86d0000da6d0000dc6d0000de6d0000e06d0000e26d0000e46d0000e66d0000e86d0000ea6d0000ec6d0000ee6d0000f06d0000f26d0000f46d0000f66d0000f86d0000 m_RenameOverlay: m_UserAcceptedRename: 0 m_Name: @@ -1329,21 +1329,21 @@ MonoBehaviour: scrollPos: {x: 0, y: 0} m_SelectedIDs: m_LastClickedID: 0 - m_ExpandedIDs: ffffffff000000007e020000786d00007a6d00007c6d00007e6d0000806d0000826d0000846d0000866d0000886d00008a6d00008c6d00008e6d0000906d0000926d0000946d0000966d0000986d00009a6d00009c6d00009e6d0000a06d0000a26d0000a46d0000a66d0000a86d0000aa6d0000ac6d0000ae6d0000b06d0000b46d0000b66d0000b86d0000ba6d0000bc6d0000be6d0000c06d0000c26d0000c46d0000c66d0000c86d0000ca6d0000cc6d0000ce6d0000d06d0000d46d0000d66d0000d86d0000da6d0000dc6d0000de6d0000e06d0000e26d0000e66d0000e86d0000ea6d0000ec6d0000ee6d0000f06d0000f26d0000f46d0000f06f000008700000cc700000 + m_ExpandedIDs: ffffffff000000007e0200008c0d0000166c00007c6d00007e6d0000806d0000826d0000846d0000866d0000886d00008a6d00008c6d00008e6d0000926d0000946d0000966d0000986d00009a6d00009c6d00009e6d0000a66d0000a86d0000aa6d0000ac6d0000ae6d0000b06d0000b26d0000b46d0000b66d0000b86d0000ba6d0000bc6d0000be6d0000c06d0000c26d0000c46d0000c66d0000c86d0000ca6d0000cc6d0000ce6d0000d06d0000d26d0000d86d0000da6d0000dc6d0000de6d0000e06d0000e26d0000e46d0000e66d0000e86d0000ea6d0000f06d0000f26d0000f66d0000cc6f0000587400006a7400006c740000707400007e74000098740000 m_RenameOverlay: m_UserAcceptedRename: 0 - m_Name: - m_OriginalName: + m_Name: LocalizationTable + m_OriginalName: LocalizationTable m_EditFieldRect: serializedVersion: 2 x: 0 y: 0 width: 0 height: 0 - m_UserData: 0 + m_UserData: 27670 m_IsWaitingForDelay: 0 m_IsRenaming: 0 - m_OriginalEventType: 11 + m_OriginalEventType: 0 m_IsRenamingFilename: 1 m_ClientGUIView: {fileID: 12} m_SearchString: @@ -1405,9 +1405,9 @@ MonoBehaviour: m_Tooltip: m_Pos: serializedVersion: 2 - x: 1342 - y: 81 - width: 573 + x: 1136 + y: 73 + width: 783 height: 926 m_SerializedDataModeController: m_DataMode: 0