Skip to content

Commit b41abf8

Browse files
committed
Addressed PR comments, changed the migration logic a bit to deal with the parsed json.
1 parent 359f03d commit b41abf8

File tree

2 files changed

+58
-52
lines changed

2 files changed

+58
-52
lines changed

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

Lines changed: 58 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,21 @@ public InputAction this[string actionNameOrId]
278278
return action;
279279
}
280280
}
281+
/// <summary>
282+
/// File‐format version constants for InputActionAsset JSON.
283+
/// </summary>
284+
static class JsonVersion
285+
{
286+
/// <summary>The original JSON version format for InputActionAsset.</summary>
287+
public const int Version0 = 0;
288+
289+
/// <summary>Updated JSON version format for InputActionAsset.</summary>
290+
/// <remarks>Changes representation of parameter values from being serialized by value to being serialized by value.</remarks>
291+
public const int Version1 = 1;
292+
293+
/// <summary>The current version.</summary>
294+
public const int Current = Version1;
295+
}
281296

282297
/// <summary>
283298
/// Return a JSON representation of the asset.
@@ -301,7 +316,7 @@ public string ToJson()
301316
{
302317
return JsonUtility.ToJson(new WriteFileJson
303318
{
304-
version = (m_Version >= 13) ? (int?)m_Version : null,
319+
version = JsonVersion.Current,
305320
name = name,
306321
maps = InputActionMap.WriteFileJson.FromMaps(m_ActionMaps).maps,
307322
controlSchemes = InputControlScheme.SchemeJson.ToJson(m_ControlSchemes),
@@ -383,12 +398,11 @@ public void LoadFromJson(string json)
383398
throw new ArgumentNullException(nameof(json));
384399

385400
var parsedJson = JsonUtility.FromJson<ReadFileJson>(json);
386-
387-
m_Version = parsedJson.version;
388-
if (m_Version <= 13)
401+
if ((parsedJson.maps?.Length ?? 0) > 0 && (parsedJson.version ?? 0) < JsonVersion.Current)
389402
{
390-
MigrateAllEnumParams(this);
403+
MigrateJson(ref parsedJson);
391404
}
405+
392406
parsedJson.ToAsset(this);
393407
}
394408

@@ -956,12 +970,11 @@ private void OnDestroy()
956970
[NonSerialized] internal InputActionRebindingExtensions.ParameterOverride[] m_ParameterOverrides;
957971

958972
[NonSerialized] internal InputActionMap.DeviceArray m_Devices;
959-
[SerializeField] internal int m_Version;
960973

961974
[Serializable]
962975
internal struct WriteFileJson
963976
{
964-
public int? version;
977+
public int version;
965978
public string name;
966979
public InputActionMap.WriteMapJson[] maps;
967980
public InputControlScheme.SchemeJson[] controlSchemes;
@@ -977,14 +990,13 @@ internal struct WriteFileJsonNoName
977990
[Serializable]
978991
internal struct ReadFileJson
979992
{
980-
public int version;
993+
public int? version;
981994
public string name;
982995
public InputActionMap.ReadMapJson[] maps;
983996
public InputControlScheme.SchemeJson[] controlSchemes;
984997

985998
public void ToAsset(InputActionAsset asset)
986999
{
987-
asset.m_Version = version;
9881000
asset.name = name;
9891001
asset.m_ActionMaps = new InputActionMap.ReadFileJson {maps = maps}.ToMaps();
9901002
asset.m_ControlSchemes = InputControlScheme.SchemeJson.ToSchemes(controlSchemes);
@@ -995,48 +1007,53 @@ public void ToAsset(InputActionAsset asset)
9951007
map.m_Asset = asset;
9961008
}
9971009
}
998-
internal static void MigrateAllEnumParams(InputActionAsset asset)
1010+
1011+
/// <summary>
1012+
/// If parsedJson.version is older than Current, rewrite every
1013+
/// action.processors entry to replace “enumName(Ordinal=…)” with
1014+
/// “enumName(Value=…)” and bump parsedJson.version.
1015+
/// </summary>
1016+
internal void MigrateJson(ref ReadFileJson parsedJson)
9991017
{
1000-
foreach (var map in asset.actionMaps)
1018+
var existing = parsedJson.version ?? JsonVersion.Version0;
1019+
if (existing >= JsonVersion.Current)
1020+
return;
1021+
1022+
for (var mi = 0; mi < parsedJson.maps.Length; ++mi)
10011023
{
1002-
foreach (var action in map.actions)
1003-
{
1004-
var raw = action.processors;
1024+
var mapJson = parsedJson.maps[mi];
10051025

1006-
List<NameAndParameters> parsedList = null;
1007-
NameAndParameters.ParseMultiple(raw, ref parsedList);
1026+
for (var ai = 0; ai < mapJson.actions.Length; ++ai)
1027+
{
1028+
var actionJson = mapJson.actions[ai];
1029+
var raw = actionJson.processors;
10081030

1009-
if (parsedList == null || parsedList.Count == 0)
1031+
if (string.IsNullOrEmpty(raw))
10101032
continue;
10111033

1012-
var rebuilt = new List<string>(parsedList.Count);
1034+
var list = NameAndParameters.ParseMultiple(raw).ToList();
1035+
var rebuilt = new List<string>(list.Count);
10131036

1014-
foreach (var nap in parsedList)
1037+
foreach (var nap in list)
10151038
{
1016-
if (nap.parameters.Count == 0 || InputSystem.TryGetProcessor(nap.name) == null)
1039+
var procType = InputSystem.TryGetProcessor(nap.name);
1040+
if (nap.parameters.Count == 0 || procType == null)
10171041
{
10181042
rebuilt.Add(nap.ToString());
10191043
continue;
10201044
}
10211045

1022-
var procType = InputSystem.TryGetProcessor(nap.name);
1023-
1024-
var dict = nap.parameters.ToDictionary(pv => pv.name, pv => pv.value.ToString());
1046+
var dict = nap.parameters.ToDictionary(p => p.name, p => p.value.ToString());
1047+
var anyChanged = false;
10251048

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)
1049+
foreach (var field in procType.GetFields(BindingFlags.Public | BindingFlags.Instance).Where(f => f.FieldType.IsEnum))
10311050
{
1032-
if (dict.TryGetValue(field.Name, out var rawString) && int.TryParse(rawString, out var ordinal))
1051+
if (dict.TryGetValue(field.Name, out var ordS) && int.TryParse(ordS, out var ord))
10331052
{
10341053
var values = Enum.GetValues(field.FieldType).Cast<object>().ToArray();
1035-
1036-
if (ordinal >= 0 && ordinal < values.Length)
1054+
if (ord >= 0 && ord < values.Length)
10371055
{
1038-
var realValue = Convert.ToInt32(values[ordinal]);
1039-
dict[field.Name] = realValue.ToString();
1056+
dict[field.Name] = Convert.ToInt32(values[ord]).ToString();
10401057
anyChanged = true;
10411058
}
10421059
}
@@ -1048,21 +1065,18 @@ internal static void MigrateAllEnumParams(InputActionAsset asset)
10481065
}
10491066
else
10501067
{
1051-
var paramString = string.Join(",", dict.Select(kv => $"{kv.Key}={kv.Value}"));
1052-
var newNamedValues = NamedValue.ParseMultiple(paramString);
1053-
1054-
var newNap = new NameAndParameters
1055-
{
1056-
name = nap.name,
1057-
parameters = new ReadOnlyArray<NamedValue>(newNamedValues)
1058-
};
1059-
1060-
rebuilt.Add(newNap.ToString());
1068+
var paramText = string.Join(",", dict.Select(kv => $"{kv.Key}={kv.Value}"));
1069+
rebuilt.Add($"{nap.name}({paramText})");
10611070
}
10621071
}
1063-
action.m_Processors = string.Join(";", rebuilt);
1072+
1073+
actionJson.processors = string.Join(";", rebuilt);
1074+
mapJson.actions[ai] = actionJson;
10641075
}
1076+
parsedJson.maps[mi] = mapJson;
10651077
}
1078+
// Bump the version so we never re-migrate
1079+
parsedJson.version = JsonVersion.Current;
10661080
}
10671081
}
10681082
}

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

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -66,14 +66,6 @@ private static InputActionAsset CreateFromJson(AssetImportContext context)
6666
{
6767
// Attempt to parse JSON
6868
asset.LoadFromJson(content);
69-
70-
// If this JSON was authored before we switched to enum-by-value, migrate it now
71-
if (asset.m_Version <= 13)
72-
{
73-
InputActionAsset.MigrateAllEnumParams(asset);
74-
asset.m_Version = kVersion;
75-
}
76-
7769
// Make sure action map names are unique within JSON file
7870
var names = new HashSet<string>();
7971
foreach (var map in asset.actionMaps)

0 commit comments

Comments
 (0)