Skip to content

Commit ff05b1d

Browse files
committed
Robust handling of migration logic
1 parent a8ba533 commit ff05b1d

File tree

3 files changed

+34
-26
lines changed

3 files changed

+34
-26
lines changed

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

Lines changed: 15 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1027,43 +1027,37 @@ internal void MigrateJson(ref ReadFileJson parsedJson)
10271027
continue;
10281028

10291029
var list = NameAndParameters.ParseMultiple(raw).ToList();
1030-
var rebuilt = new List<string>(list.Count);
1030+
var converted = new List<NameAndParameters>(list.Count);
10311031
foreach (var nap in list)
10321032
{
10331033
var procType = InputSystem.TryGetProcessor(nap.name);
10341034
if (nap.parameters.Count == 0 || procType == null)
10351035
{
1036-
rebuilt.Add(nap.ToString());
1036+
converted.Add(nap);
10371037
continue;
10381038
}
10391039

1040-
var dict = nap.parameters.ToDictionary(p => p.name, p => p.value.ToString());
1041-
var anyChanged = false;
1042-
foreach (var field in procType.GetFields(BindingFlags.Public | BindingFlags.Instance).Where(f => f.FieldType.IsEnum))
1040+
var updatedParameters = new List<NamedValue>(nap.parameters.Count);
1041+
foreach (var param in nap.parameters)
10431042
{
1044-
if (dict.TryGetValue(field.Name, out var ordS) && int.TryParse(ordS, out var ord))
1043+
var updatedPar = param;
1044+
var fieldInfo = procType.GetField(param.name, BindingFlags.Public | BindingFlags.Instance);
1045+
if(fieldInfo != null && fieldInfo.FieldType.IsEnum)
10451046
{
1046-
var values = Enum.GetValues(field.FieldType).Cast<object>().ToArray();
1047-
if (ord >= 0 && ord < values.Length)
1047+
var index = param.value.ToInt32();
1048+
var values = Enum.GetValues(fieldInfo.FieldType);
1049+
if(index >= 0 && index < values.Length)
10481050
{
1049-
dict[field.Name] = Convert.ToInt32(values[ord]).ToString();
1050-
anyChanged = true;
1051+
var convertedValue = Convert.ToInt32(values.GetValue(index));
1052+
updatedPar = NamedValue.From(param.name, convertedValue);
10511053
}
10521054
}
1055+
updatedParameters.Add(updatedPar);
10531056
}
1054-
1055-
if (!anyChanged)
1056-
{
1057-
rebuilt.Add(nap.ToString());
1058-
}
1059-
else
1060-
{
1061-
var paramText = string.Join(",", dict.Select(kv => $"{kv.Key}={kv.Value}"));
1062-
rebuilt.Add($"{nap.name}({paramText})");
1063-
}
1057+
converted.Add(NameAndParameters.Create(nap.name, updatedParameters));
10641058
}
10651059

1066-
actionJson.processors = string.Join(",", rebuilt);
1060+
actionJson.processors = NameAndParameters.SerializeMultiple(converted);
10671061
mapJson.actions[ai] = actionJson;
10681062
}
10691063
parsedJson.maps[mi] = mapJson;

Packages/com.unity.inputsystem/InputSystem/Editor/UITKAssetEditor/Views/NameAndParametersListView.cs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -83,11 +83,7 @@ private void OnParametersChanged(ParameterListView listView, int index)
8383

8484
private static string ToSerializableString(IEnumerable<NameAndParameters> parametersForEachListItem)
8585
{
86-
if (parametersForEachListItem == null)
87-
return string.Empty;
88-
89-
return string.Join(NamedValue.Separator,
90-
parametersForEachListItem.Select(x => x.ToString()).ToArray());
86+
return NameAndParameters.SerializeMultiple(parametersForEachListItem);
9187
}
9288

9389
public override void RedrawUI(InputActionsEditorState state)

Packages/com.unity.inputsystem/InputSystem/Utilities/NameAndParameters.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,24 @@ public override string ToString()
2727
return $"{name}({parameterString})";
2828
}
2929

30+
internal static string SerializeMultiple(IEnumerable<NameAndParameters> list)
31+
{
32+
if(list == null)
33+
return string.Empty;
34+
35+
return string.Join(NamedValue.Separator, list.Select(x => x.ToString()).ToArray());
36+
}
37+
38+
internal static NameAndParameters Create(string name, IList<NamedValue> parameters)
39+
{
40+
var result = new NameAndParameters
41+
{
42+
name = name,
43+
parameters = new ReadOnlyArray<NamedValue>(parameters.ToArray())
44+
};
45+
return result;
46+
}
47+
3048
public static IEnumerable<NameAndParameters> ParseMultiple(string text)
3149
{
3250
List<NameAndParameters> list = null;

0 commit comments

Comments
 (0)