@@ -86,8 +86,16 @@ private static InputActionAsset CreateNewActionAsset()
86
86
}
87
87
}
88
88
89
- // Create sub-asset for each action. This is so that users can select individual input actions from the asset when they're
90
- // trying to assign to a field that accepts only one action.
89
+ CreateInputActionReferences ( asset ) ;
90
+
91
+ AssetDatabase . SaveAssets ( ) ;
92
+
93
+ return asset ;
94
+ }
95
+
96
+ private static void CreateInputActionReferences ( InputActionAsset asset )
97
+ {
98
+ var maps = asset . actionMaps ;
91
99
foreach ( var map in maps )
92
100
{
93
101
foreach ( var action in map . actions )
@@ -97,10 +105,51 @@ private static InputActionAsset CreateNewActionAsset()
97
105
AssetDatabase . AddObjectToAsset ( actionReference , asset ) ;
98
106
}
99
107
}
108
+ }
100
109
101
- AssetDatabase . SaveAssets ( ) ;
110
+ /// <summary>
111
+ /// Updates the input action references in the asset by updating names, removing dangling references
112
+ /// and adding new ones.
113
+ /// </summary>
114
+ /// <param name="asset"></param>
115
+ internal static void UpdateInputActionReferences ( )
116
+ {
117
+ var asset = GetOrCreate ( ) ;
118
+ var existingReferences = InputActionImporter . LoadInputActionReferencesFromAsset ( asset ) . ToList ( ) ;
102
119
103
- return asset ;
120
+ // Check if referenced input action exists in the asset and remove the reference if it doesn't.
121
+ foreach ( var actionReference in existingReferences )
122
+ {
123
+ var action = asset . FindAction ( actionReference . action . id ) ;
124
+ if ( action == null )
125
+ {
126
+ actionReference . Set ( null ) ;
127
+ AssetDatabase . RemoveObjectFromAsset ( actionReference ) ;
128
+ }
129
+ }
130
+
131
+ // Check if all actions have a reference
132
+ foreach ( var action in asset )
133
+ {
134
+ var actionReference = existingReferences . FirstOrDefault ( r => r . m_ActionId == action . id . ToString ( ) ) ;
135
+ // The input action doesn't have a reference, create a new one.
136
+ if ( actionReference == null )
137
+ {
138
+ var actionReferenceNew = ScriptableObject . CreateInstance < InputActionReference > ( ) ;
139
+ actionReferenceNew . Set ( action ) ;
140
+ AssetDatabase . AddObjectToAsset ( actionReferenceNew , asset ) ;
141
+ }
142
+ else
143
+ {
144
+ // Update the name of the reference if it doesn't match the action name.
145
+ if ( actionReference . name != InputActionReference . GetDisplayName ( action ) )
146
+ {
147
+ AssetDatabase . RemoveObjectFromAsset ( actionReference ) ;
148
+ actionReference . name = InputActionReference . GetDisplayName ( action ) ;
149
+ AssetDatabase . AddObjectToAsset ( actionReference , asset ) ;
150
+ }
151
+ }
152
+ }
104
153
}
105
154
}
106
155
}
0 commit comments