add InputReader

#add
-ReadButton
-ReadOnce
-ReadInput
-ReadTog
This commit is contained in:
陈思海 2026-03-18 13:33:46 +08:00
parent ca4d33698f
commit 88af70ff61
4 changed files with 403 additions and 106 deletions

View File

@ -0,0 +1,221 @@
using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
public static class InputActionReader
{
private readonly struct InputReadKey : IEquatable<InputReadKey>
{
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<InputReadKey> PressedKeys = new();
private static readonly HashSet<InputReadKey> ToggledKeys = new();
public static T ReadValue<T>(string actionName) where T : struct
{
return ResolveAction(actionName).ReadValue<T>();
}
public static object ReadValue(string actionName)
{
return ResolveAction(actionName).ReadValueAsObject();
}
public static bool TryReadValue<T>(string actionName, out T value) where T : struct
{
InputAction inputAction = ResolveAction(actionName);
if (inputAction.IsPressed())
{
value = inputAction.ReadValue<T>();
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<T>(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<T>(InputReadKey readKey, string actionName, out T value) where T : struct
{
InputAction inputAction = ResolveAction(actionName);
if (inputAction.IsPressed())
{
if (PressedKeys.Add(readKey))
{
value = inputAction.ReadValue<T>();
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);
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: b9368556ed4729ae618e0a19d3a7925b
timeCreated: 1773811724

View File

@ -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<InputBindingManager>
public string fileName = "input_bindings.json";
public bool debugMode = false;
public Dictionary<string, ActionMap> actionMap = new Dictionary<string, ActionMap>();
public HashSet<RebindContext> preparedRebinds = new HashSet<RebindContext>();
internal InputActionRebindingExtensions.RebindingOperation rebindOperation;
private bool isApplyPending = false;
private string defaultBindingsJson = string.Empty;
private string cachedSavePath;
private Dictionary<string, (ActionMap map, ActionMap.Action action)> actionLookup = new Dictionary<string, (ActionMap, ActionMap.Action)>();
// 用于替代 Rx.NET Subjects 的事件
private readonly Dictionary<string, ActionMap> actionMap = new(StringComparer.Ordinal);
private readonly HashSet<RebindContext> preparedRebinds = new();
private readonly Dictionary<string, (ActionMap map, ActionMap.Action action)> actionLookup = new(StringComparer.Ordinal);
private readonly Dictionary<Guid, (ActionMap map, ActionMap.Action action)> actionLookupById = new();
private readonly HashSet<string> ambiguousActionNames = new(StringComparer.Ordinal);
private event Action _onInputsInit;
public event Action OnInputsInit
@ -59,6 +56,9 @@ public class InputBindingManager : MonoSingleton<InputBindingManager>
private bool isInputsInitialized = false;
public IReadOnlyDictionary<string, ActionMap> ActionMaps => actionMap;
public IReadOnlyCollection<RebindContext> PreparedRebinds => preparedRebinds;
public string SavePath
{
get
@ -160,38 +160,48 @@ public class InputBindingManager : MonoSingleton<InputBindingManager>
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<string, ActionMap>(mapCount);
actionLookup = new Dictionary<string, (ActionMap, ActionMap.Action)>(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<InputBindingManager>
{
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 : "<no-map>";
cachedToString = $"{mapName}/{action.name}:{bindingIndex}";
}
return cachedToString ?? "<null>";
@ -374,15 +394,40 @@ public class InputBindingManager : MonoSingleton<InputBindingManager>
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;
}
/// <summary>
/// 开始重新绑定指定的输入操作
/// </summary>
@ -443,7 +488,7 @@ public class InputBindingManager : MonoSingleton<InputBindingManager>
}
}
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<InputBindingManager>
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<InputBindingManager>
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 则查找部分
/// <summary>

View File

@ -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