/// <summary> /// Updates an Existing SlotDataAsset. /// </summary> /// <param name="slot">The existing SlotDataAsset to be updated</param> /// <param name="mesh">Mesh.</param> /// <param name="material">Material.</param> /// <param name="prefabMesh">Prefab mesh.</param> /// <param name="rootBone">Root bone.</param> public static void UpdateSlotData(SlotDataAsset slot, SkinnedMeshRenderer mesh, UMAMaterial material, SkinnedMeshRenderer prefabMesh, string rootBone) { string path = UMAUtils.GetAssetFolder(AssetDatabase.GetAssetPath(slot)); string assetName = slot.slotName; if (path.Length <= 0) { Debug.LogWarning("CreateSlotData: Path to existing asset is empty!"); return; } GameObject tempGameObject = UnityEngine.Object.Instantiate(mesh.transform.parent.gameObject) as GameObject; var resultingSkinnedMeshes = tempGameObject.GetComponentsInChildren <SkinnedMeshRenderer>(); SkinnedMeshRenderer resultingSkinnedMesh = null; foreach (var skinnedMesh in resultingSkinnedMeshes) { if (skinnedMesh.name == mesh.name) { resultingSkinnedMesh = skinnedMesh; } } Mesh resultingMesh; if (prefabMesh != null) { resultingMesh = SeamRemoval.PerformSeamRemoval(resultingSkinnedMesh, prefabMesh, 0.0001f); resultingSkinnedMesh.sharedMesh = resultingMesh; SkinnedMeshAligner.AlignBindPose(prefabMesh, resultingSkinnedMesh); } else { resultingMesh = (Mesh)GameObject.Instantiate(resultingSkinnedMesh.sharedMesh); } //CountBoneweights(resultingMesh); var usedBonesDictionary = CompileUsedBonesDictionary(resultingMesh, new List <int>()); if (usedBonesDictionary.Count != resultingSkinnedMesh.bones.Length) { resultingMesh = BuildNewReduceBonesMesh(resultingMesh, usedBonesDictionary); } //CountBoneweights(resultingMesh); string meshAssetName = path + '/' + mesh.name + ".asset"; AssetDatabase.CreateAsset(resultingMesh, meshAssetName); tempGameObject.name = mesh.transform.parent.gameObject.name; Transform[] transformList = tempGameObject.GetComponentsInChildren <Transform>(); GameObject newObject = new GameObject(); for (int i = 0; i < transformList.Length; i++) { if (transformList[i].name == rootBone) { transformList[i].parent = newObject.transform; } else if (transformList[i].name == mesh.name) { transformList[i].parent = newObject.transform; } } GameObject.DestroyImmediate(tempGameObject); resultingSkinnedMesh = newObject.GetComponentInChildren <SkinnedMeshRenderer>(); if (resultingSkinnedMesh) { if (usedBonesDictionary.Count != resultingSkinnedMesh.bones.Length) { resultingSkinnedMesh.bones = BuildNewReducedBonesList(resultingSkinnedMesh.bones, usedBonesDictionary); } resultingSkinnedMesh.sharedMesh = resultingMesh; //CountBoneweights(resultingMesh); } string SkinnedName = path + '/' + assetName + "_Skinned.prefab"; #if UNITY_2018_3_OR_NEWER var skinnedResult = PrefabUtility.SaveAsPrefabAsset(newObject, SkinnedName); #else var skinnedResult = UnityEditor.PrefabUtility.CreatePrefab(SkinnedName, newObject); #endif GameObject.DestroyImmediate(newObject); var meshgo = skinnedResult.transform.Find(mesh.name); var finalMeshRenderer = meshgo.GetComponent <SkinnedMeshRenderer>(); slot.UpdateMeshData(finalMeshRenderer, rootBone); slot.meshData.SlotName = slot.slotName; var cloth = mesh.GetComponent <Cloth>(); if (cloth != null) { slot.meshData.RetrieveDataFromUnityCloth(cloth); } AssetDatabase.SaveAssets(); AssetDatabase.DeleteAsset(SkinnedName); AssetDatabase.DeleteAsset(meshAssetName); }