Skip to content

Commit 37d1dfb

Browse files
committed
Handle migration for LoadFromJson aswell and used NameAndParamerter parser, moved the migration funciton to the InputActionAsset.
1 parent 8c65e40 commit 37d1dfb

File tree

2 files changed

+84
-79
lines changed

2 files changed

+84
-79
lines changed

Packages/com.unity.inputsystem/InputSystem/Actions/InputActionAsset.cs

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
using System;
22
using System.Collections;
33
using System.Collections.Generic;
4+
using System.Linq;
5+
using System.Reflection;
6+
using UnityEngine.InputSystem.Editor;
47
using UnityEngine.InputSystem.Utilities;
58

69
////TODO: make the FindAction logic available on any IEnumerable<InputAction> and IInputActionCollection via extension methods
@@ -380,6 +383,12 @@ public void LoadFromJson(string json)
380383
throw new ArgumentNullException(nameof(json));
381384

382385
var parsedJson = JsonUtility.FromJson<ReadFileJson>(json);
386+
387+
m_Version = parsedJson.version;
388+
if (m_Version <= 13)
389+
{
390+
MigrateAllEnumParams(this);
391+
}
383392
parsedJson.ToAsset(this);
384393
}
385394

@@ -986,5 +995,77 @@ public void ToAsset(InputActionAsset asset)
986995
map.m_Asset = asset;
987996
}
988997
}
998+
internal static void MigrateAllEnumParams(InputActionAsset asset)
999+
{
1000+
foreach (var map in asset.actionMaps)
1001+
{
1002+
foreach (var action in map.actions)
1003+
{
1004+
var raw = action.processors;
1005+
1006+
List<NameAndParameters> parsedList = null;
1007+
NameAndParameters.ParseMultiple(raw, ref parsedList);
1008+
1009+
if (parsedList == null || parsedList.Count == 0)
1010+
continue;
1011+
1012+
var rebuilt = new List<string>(parsedList.Count);
1013+
1014+
foreach (var nap in parsedList)
1015+
{
1016+
if (nap.parameters.Count == 0 || InputSystem.TryGetProcessor(nap.name) == null)
1017+
{
1018+
rebuilt.Add(nap.ToString());
1019+
continue;
1020+
}
1021+
1022+
var procType = InputSystem.TryGetProcessor(nap.name);
1023+
1024+
var dict = nap.parameters.ToDictionary(pv => pv.name, pv => pv.value.ToString());
1025+
1026+
bool anyChanged = false;
1027+
1028+
var enumFields = procType.GetFields(BindingFlags.Public | BindingFlags.Instance).Where(f => f.FieldType.IsEnum);
1029+
1030+
foreach (var field in enumFields)
1031+
{
1032+
if (dict.TryGetValue(field.Name, out var rawString) && int.TryParse(rawString, out var ordinal))
1033+
{
1034+
var values = Enum.GetValues(field.FieldType).Cast<object>().ToArray();
1035+
1036+
if (ordinal >= 0 && ordinal < values.Length)
1037+
{
1038+
var realValue = Convert.ToInt32(values[ordinal]);
1039+
dict[field.Name] = realValue.ToString();
1040+
anyChanged = true;
1041+
}
1042+
}
1043+
}
1044+
1045+
if (!anyChanged)
1046+
{
1047+
Debug.Log("No Change");
1048+
1049+
rebuilt.Add(nap.ToString());
1050+
}
1051+
else
1052+
{
1053+
Debug.Log("Changed");
1054+
var paramString = string.Join(",", dict.Select(kv => $"{kv.Key}={kv.Value}"));
1055+
var newNamedValues = NamedValue.ParseMultiple(paramString);
1056+
1057+
var newNap = new NameAndParameters
1058+
{
1059+
name = nap.name,
1060+
parameters = new ReadOnlyArray<NamedValue>(newNamedValues)
1061+
};
1062+
1063+
rebuilt.Add(newNap.ToString());
1064+
}
1065+
}
1066+
action.m_Processors = string.Join(";", rebuilt);
1067+
}
1068+
}
1069+
}
9891070
}
9901071
}

Packages/com.unity.inputsystem/InputSystem/Editor/AssetImporter/InputActionImporter.cs

Lines changed: 3 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ namespace UnityEngine.InputSystem.Editor
2929
[ScriptedImporter(kVersion, InputActionAsset.Extension)]
3030
internal class InputActionImporter : ScriptedImporter
3131
{
32-
private const int kVersion = 13;
32+
internal const int kVersion = 14;
3333

3434
[SerializeField] private bool m_GenerateWrapperCode;
3535
[SerializeField] private string m_WrapperCodePath;
@@ -69,16 +69,10 @@ private static InputActionAsset CreateFromJson(AssetImportContext context)
6969
asset.LoadFromJson(content);
7070

7171
// If this JSON was authored before we switched to enum-by-value, migrate it now
72-
if (asset.m_Version < kVersion)
72+
if (asset.m_Version <= 13)
7373
{
74-
MigrateAllEnumParams(asset);
74+
InputActionAsset.MigrateAllEnumParams(asset);
7575
asset.m_Version = kVersion;
76-
77-
if (!EditorHelpers.WriteAsset(context.assetPath, asset.ToJson()))
78-
context.LogImportError($"Could not write migrated JSON to '{context.assetPath}'");
79-
80-
EditorUtility.SetDirty(asset);
81-
return null;
8276
}
8377

8478
// Make sure action map names are unique within JSON file
@@ -131,76 +125,6 @@ private static InputActionAsset CreateFromJson(AssetImportContext context)
131125
return asset;
132126
}
133127

134-
internal static void MigrateAllEnumParams(InputActionAsset asset)
135-
{
136-
foreach (var map in asset.actionMaps)
137-
{
138-
foreach (var action in map.actions)
139-
{
140-
var raw = action.processors;
141-
if (string.IsNullOrEmpty(raw))
142-
continue;
143-
144-
var rebuilt = new List<string>();
145-
foreach (var entry in raw.Split(';'))
146-
{
147-
var e = entry.Trim();
148-
if (e.Length == 0)
149-
{
150-
rebuilt.Add(e);
151-
continue;
152-
}
153-
154-
var paren = e.IndexOf('(');
155-
string procName = paren >= 0 ? e.Substring(0, paren) : e;
156-
string args = paren >= 0
157-
? e.Substring(paren + 1, e.Length - paren - 2)
158-
: null;
159-
160-
var procType = InputSystem.TryGetProcessor(procName);
161-
if (procType != null && args != null)
162-
{
163-
var patched = PatchEnumArgs(procType, args);
164-
rebuilt.Add($"{procName}({patched})");
165-
}
166-
else
167-
{
168-
rebuilt.Add(e);
169-
}
170-
}
171-
172-
action.m_Processors = string.Join(";", rebuilt);
173-
}
174-
}
175-
}
176-
177-
internal static string PatchEnumArgs(Type procType, string args)
178-
{
179-
var dict = args.Split(new[] {','}, StringSplitOptions.RemoveEmptyEntries).Select(p => p.Split('=')).ToDictionary(kv => kv[0], kv => kv[1]);
180-
var anyChanged = false;
181-
var enumFields = procType.GetFields(BindingFlags.Public | BindingFlags.Instance).Where(f => f.FieldType.IsEnum);
182-
183-
foreach (var field in enumFields)
184-
{
185-
if (dict.TryGetValue(field.Name, out var raw) && int.TryParse(raw, out var ordinal))
186-
{
187-
var values = Enum.GetValues(field.FieldType).Cast<object>().ToArray();
188-
189-
if (ordinal >= 0 && ordinal < values.Length)
190-
{
191-
var real = Convert.ToInt32(values[ordinal]);
192-
dict[field.Name] = real.ToString();
193-
anyChanged = true;
194-
}
195-
}
196-
}
197-
198-
if (!anyChanged)
199-
return args;
200-
201-
return string.Join(",", dict.Select(kv => $"{kv.Key}={kv.Value}"));
202-
}
203-
204128
public override void OnImportAsset(AssetImportContext ctx)
205129
{
206130
if (ctx == null)

0 commit comments

Comments
 (0)