@@ -1164,6 +1164,17 @@ public HashSet<String> GetNodesToRename()
1164
1164
return m_nodesToRename ;
1165
1165
}
1166
1166
1167
+ /// <summary>
1168
+ /// Get the equivalent transform on the linked prefab for the given fbx transform.
1169
+ /// e.g. if there is a transform called Bone1 in the fbx, find the transform called Bone1 in the prefab.
1170
+ /// </summary>
1171
+ /// <returns>The linked prefab transform that matches the given fbx transform or null if not found</returns>
1172
+ private Transform GetMatchingPrefabTransform ( Transform fbxTransform , Transform fbxAssetRoot , Transform prefabAssetRoot )
1173
+ {
1174
+ var transformPath = AnimationUtility . CalculateTransformPath ( fbxTransform , fbxAssetRoot ) ;
1175
+ return prefabAssetRoot . Find ( transformPath ) ;
1176
+ }
1177
+
1167
1178
/// <summary>
1168
1179
/// Then we act -- in a slightly different order:
1169
1180
/// 1. Create all the new nodes we need to create.
@@ -1355,6 +1366,42 @@ public HashSet<GameObject> ImplementUpdates(FbxPrefab prefabInstance)
1355
1366
}
1356
1367
// Now set the values.
1357
1368
UnityEditor . EditorJsonUtility . FromJsonOverwrite ( fbxComponent . jsonValue , prefabComponent ) ;
1369
+
1370
+ // if the prefab component is a skinned mesh renderer, then make sure to update the bone list so that
1371
+ // the bones are in the prefab, and not the fbx
1372
+ if ( prefabComponent is SkinnedMeshRenderer )
1373
+ {
1374
+ var skinnedMeshComponent = prefabComponent as SkinnedMeshRenderer ;
1375
+ var rootBone = skinnedMeshComponent . rootBone ;
1376
+ var bones = skinnedMeshComponent . bones ;
1377
+
1378
+ var fbxAssetTransform = m_fbxPrefabUtility . GetFbxAsset ( ) . transform ;
1379
+
1380
+ var rootPrefabTransform = GetMatchingPrefabTransform ( rootBone , fbxAssetTransform , prefabRoot ) ;
1381
+ if ( rootPrefabTransform == null )
1382
+ {
1383
+ Debug . LogWarningFormat ( "FbxPrefabAutoUpdater: Could not find root bone {0} for {1} skinned mesh in linked prefab" , rootBone . name , skinnedMeshComponent . name ) ;
1384
+ }
1385
+ skinnedMeshComponent . rootBone = rootPrefabTransform ;
1386
+
1387
+ var prefabBones = new Transform [ bones . Length ] ;
1388
+ for ( int i = 0 ; i < bones . Length ; i ++ )
1389
+ {
1390
+ var bone = bones [ i ] ;
1391
+
1392
+ var prefabTransform = GetMatchingPrefabTransform ( bone , fbxAssetTransform , prefabRoot ) ;
1393
+ if ( prefabTransform == null )
1394
+ {
1395
+ Debug . LogWarningFormat ( "FbxPrefabAutoUpdater: Could not find bone {0} for {1} skinned mesh" , bone . name , skinnedMeshComponent . name ) ;
1396
+ continue ;
1397
+ }
1398
+
1399
+ prefabBones [ i ] = prefabTransform ;
1400
+ }
1401
+ skinnedMeshComponent . bones = prefabBones ;
1402
+
1403
+ continue ;
1404
+ }
1358
1405
}
1359
1406
}
1360
1407
return updatedNodes ;
0 commit comments