@@ -278,6 +278,21 @@ public InputAction this[string actionNameOrId]
278
278
return action ;
279
279
}
280
280
}
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
+ }
281
296
282
297
/// <summary>
283
298
/// Return a JSON representation of the asset.
@@ -301,7 +316,7 @@ public string ToJson()
301
316
{
302
317
return JsonUtility . ToJson ( new WriteFileJson
303
318
{
304
- version = ( m_Version >= 13 ) ? ( int ? ) m_Version : null ,
319
+ version = JsonVersion . Current ,
305
320
name = name ,
306
321
maps = InputActionMap . WriteFileJson . FromMaps ( m_ActionMaps ) . maps ,
307
322
controlSchemes = InputControlScheme . SchemeJson . ToJson ( m_ControlSchemes ) ,
@@ -383,12 +398,11 @@ public void LoadFromJson(string json)
383
398
throw new ArgumentNullException ( nameof ( json ) ) ;
384
399
385
400
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 )
389
402
{
390
- MigrateAllEnumParams ( this ) ;
403
+ MigrateJson ( ref parsedJson ) ;
391
404
}
405
+
392
406
parsedJson . ToAsset ( this ) ;
393
407
}
394
408
@@ -956,12 +970,11 @@ private void OnDestroy()
956
970
[ NonSerialized ] internal InputActionRebindingExtensions . ParameterOverride [ ] m_ParameterOverrides ;
957
971
958
972
[ NonSerialized ] internal InputActionMap . DeviceArray m_Devices ;
959
- [ SerializeField ] internal int m_Version ;
960
973
961
974
[ Serializable ]
962
975
internal struct WriteFileJson
963
976
{
964
- public int ? version ;
977
+ public int version ;
965
978
public string name ;
966
979
public InputActionMap . WriteMapJson [ ] maps ;
967
980
public InputControlScheme . SchemeJson [ ] controlSchemes ;
@@ -977,14 +990,13 @@ internal struct WriteFileJsonNoName
977
990
[ Serializable ]
978
991
internal struct ReadFileJson
979
992
{
980
- public int version ;
993
+ public int ? version ;
981
994
public string name ;
982
995
public InputActionMap . ReadMapJson [ ] maps ;
983
996
public InputControlScheme . SchemeJson [ ] controlSchemes ;
984
997
985
998
public void ToAsset ( InputActionAsset asset )
986
999
{
987
- asset . m_Version = version ;
988
1000
asset . name = name ;
989
1001
asset . m_ActionMaps = new InputActionMap . ReadFileJson { maps = maps } . ToMaps ( ) ;
990
1002
asset . m_ControlSchemes = InputControlScheme . SchemeJson . ToSchemes ( controlSchemes ) ;
@@ -995,48 +1007,53 @@ public void ToAsset(InputActionAsset asset)
995
1007
map . m_Asset = asset ;
996
1008
}
997
1009
}
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 )
999
1017
{
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 )
1001
1023
{
1002
- foreach ( var action in map . actions )
1003
- {
1004
- var raw = action . processors ;
1024
+ var mapJson = parsedJson . maps [ mi ] ;
1005
1025
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 ;
1008
1030
1009
- if ( parsedList == null || parsedList . Count == 0 )
1031
+ if ( string . IsNullOrEmpty ( raw ) )
1010
1032
continue ;
1011
1033
1012
- var rebuilt = new List < string > ( parsedList . Count ) ;
1034
+ var list = NameAndParameters . ParseMultiple ( raw ) . ToList ( ) ;
1035
+ var rebuilt = new List < string > ( list . Count ) ;
1013
1036
1014
- foreach ( var nap in parsedList )
1037
+ foreach ( var nap in list )
1015
1038
{
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 )
1017
1041
{
1018
1042
rebuilt . Add ( nap . ToString ( ) ) ;
1019
1043
continue ;
1020
1044
}
1021
1045
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 ;
1025
1048
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 ) )
1031
1050
{
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 ) )
1033
1052
{
1034
1053
var values = Enum . GetValues ( field . FieldType ) . Cast < object > ( ) . ToArray ( ) ;
1035
-
1036
- if ( ordinal >= 0 && ordinal < values . Length )
1054
+ if ( ord >= 0 && ord < values . Length )
1037
1055
{
1038
- var realValue = Convert . ToInt32 ( values [ ordinal ] ) ;
1039
- dict [ field . Name ] = realValue . ToString ( ) ;
1056
+ dict [ field . Name ] = Convert . ToInt32 ( values [ ord ] ) . ToString ( ) ;
1040
1057
anyChanged = true ;
1041
1058
}
1042
1059
}
@@ -1048,21 +1065,18 @@ internal static void MigrateAllEnumParams(InputActionAsset asset)
1048
1065
}
1049
1066
else
1050
1067
{
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 } )") ;
1061
1070
}
1062
1071
}
1063
- action . m_Processors = string . Join ( ";" , rebuilt ) ;
1072
+
1073
+ actionJson . processors = string . Join ( ";" , rebuilt ) ;
1074
+ mapJson . actions [ ai ] = actionJson ;
1064
1075
}
1076
+ parsedJson . maps [ mi ] = mapJson ;
1065
1077
}
1078
+ // Bump the version so we never re-migrate
1079
+ parsedJson . version = JsonVersion . Current ;
1066
1080
}
1067
1081
}
1068
1082
}
0 commit comments