public void SaveMeshesToOutputFolderAndAssignToSMRs(Mesh[] targetMeshes, SkinnedMeshRenderer[] targetSMRs) { //validate meshes for (int i = 0; i < targetMeshes.Length; i++) { if (targetSMRs[i] == null) { Debug.LogError(string.Format("Target Mesh {0} is null", i)); return; } if (targetSMRs[i].sharedMesh == null) { Debug.LogError(string.Format("Target Mesh {0} does not have a mesh", i)); return; } MB_PrefabType pt = MBVersionEditor.GetPrefabType(targetMeshes[i]); if (pt == MB_PrefabType.modelPrefab) { Debug.LogError(string.Format("Target Mesh {0} is an imported model prefab. Can't modify these meshes because changes will be overwritten the next time the model is saved or reimported. Try instantiating the prefab and using skinned meshes from the scene instance.", i)); return; } } //validate output folder if (outputFolderProp.stringValue == null) { Debug.LogError("Output folder must be set"); return; } if (outputFolderProp.stringValue.StartsWith(Application.dataPath)) { string relativePath = "Assets" + outputFolderProp.stringValue.Substring(Application.dataPath.Length); string gid = AssetDatabase.AssetPathToGUID(relativePath); if (gid == null) { Debug.LogError("Output folder must be a folder in the Unity project Asset folder"); return; } } else { Debug.LogError("Output folder must be a folder in the Unity project Asset folder"); return; } for (int i = 0; i < targetMeshes.Length; i++) { Mesh m = targetMeshes[i]; string pth = ConvertAbsolutePathToUnityPath(outputFolderProp.stringValue + "/" + targetMeshes[i].name + ".Asset"); if (pth == null) { Debug.LogError("The output folder must be a folder in the project Assets folder."); return; } AssetDatabase.CreateAsset(m, pth); targetSMRs[i].sharedMesh = m; Debug.Log(string.Format("Created mesh at {0}. Updated Skinned Mesh {1} to use created mesh.", pth, targetSMRs[i].name)); } AssetDatabase.SaveAssets(); }
public static void AddDroppedObjects(object[] objs, MB3_MeshBakerRoot momm) { if (objs != null) { HashSet <Renderer> renderersToAdd = new HashSet <Renderer>(); for (int i = 0; i < objs.Length; i++) { object obj = objs[i]; if (obj is GameObject) { Renderer[] rs = ((GameObject)obj).GetComponentsInChildren <Renderer>(); for (int j = 0; j < rs.Length; j++) { if (rs[j] is MeshRenderer || rs[j] is SkinnedMeshRenderer) { renderersToAdd.Add(rs[j]); } } } } int numAdded = 0; List <GameObject> objsToCombine = momm.GetObjectsToCombine(); bool failedToAddAssets = false; foreach (Renderer r in renderersToAdd) { if (!objsToCombine.Contains(r.gameObject)) { MB_PrefabType prefabType = MBVersionEditor.GetPrefabType(r.gameObject); if (prefabType == MB_PrefabType.modelPrefab || prefabType == MB_PrefabType.prefab) { failedToAddAssets = true; } else { objsToCombine.Add(r.gameObject); numAdded++; } } } if (failedToAddAssets) { Debug.LogError("Did not add some object(s) because they are not scene objects"); } Debug.Log("Added " + numAdded + " renderers"); } }
public bool CheckPrefabTypes(MB_ObjsToCombineTypes objToCombineType, List <GameObject> objsToMesh) { for (int i = 0; i < objsToMesh.Count; i++) { MB_PrefabType pt = MBVersionEditor.GetPrefabType(objsToMesh[i]); if (pt == MB_PrefabType.sceneInstance) { // these are scene objects if (objToCombineType == MB_ObjsToCombineTypes.prefabOnly) { Debug.LogWarning("The list of objects to combine contains scene objects. You probably want prefabs. If using scene objects ensure position is zero, rotation is zero and scale is one. Translation, Rotation and Scale will be baked into the generated mesh." + objsToMesh[i] + " is a scene object"); return(false); } } else if (objToCombineType == MB_ObjsToCombineTypes.sceneObjOnly) { //these are prefabs Debug.LogWarning("The list of objects to combine contains prefab assets. You probably want scene objects." + objsToMesh[i] + " is a prefab object"); return(false); } } return(true); }
public void CopyBoneWeightsFromSeamMeshToOtherMeshes(MB3_BoneWeightCopier bwc) { if (bwc.seamMesh == null) { Debug.LogError("The seamMesh cannot be null."); return; } UnityEngine.Object pr = (UnityEngine.Object)PrefabUtility.GetPrefabObject(bwc.seamMesh.gameObject); string assetPath = null; if (pr != null) { assetPath = AssetDatabase.GetAssetPath(pr); } if (assetPath != null) { ModelImporter mi = (ModelImporter)AssetImporter.GetAtPath(assetPath); if (mi != null) { if (mi.optimizeMesh) { Debug.LogError(string.Format("The seam mesh has 'optimized' checked in the asset importer. This will result in no vertices. Uncheck 'optimized'.")); return; } } } //todo check that output game object exists and is a prefab if (bwc.outputPrefab == null) { Debug.LogError(string.Format("The output game object must be assigned and must be a prefab of a game object in the project folder.")); return; } if (MBVersionEditor.GetPrefabType(bwc.outputPrefab) != MB_PrefabType.prefab) { Debug.LogError("The output game object must be a prefab. Create a prefab in the project and drag an empty game object to it."); return; } //duplicate the source prefab and the meshes if (copyOfInput != null) { DestroyImmediate(copyOfInput); } copyOfInput = (GameObject)GameObject.Instantiate(bwc.inputGameObject); SkinnedMeshRenderer[] targSkinnedMeshes = copyOfInput.GetComponentsInChildren <SkinnedMeshRenderer>(); Mesh[] targs = new Mesh[targSkinnedMeshes.Length]; for (int i = 0; i < targSkinnedMeshes.Length; i++) { if (targSkinnedMeshes[i].sharedMesh == null) { Debug.LogError(string.Format("Skinned Mesh {0} does not have a mesh", targSkinnedMeshes[i])); return; } MB_PrefabType pt = MBVersionEditor.GetPrefabType(targSkinnedMeshes[i].gameObject); if (pt == MB_PrefabType.modelPrefab) { Debug.LogError(string.Format("Target Mesh {0} is an imported model prefab. Can't modify these meshes because changes will be overwritten the next time the model is saved or reimported. Try instantiating the prefab and using skinned meshes from the scene instance.", i)); return; } targs[i] = (Mesh)GameObject.Instantiate(targSkinnedMeshes[i].sharedMesh); } MB3_CopyBoneWeights.CopyBoneWeightsFromSeamMeshToOtherMeshes(bwc.radius, bwc.seamMesh.sharedMesh, targs); SaveMeshesToOutputFolderAndAssignToSMRs(targs, targSkinnedMeshes); EditorUtility.SetDirty(copyOfInput); // TODO tried using 2018 replace prefab but there were errors. //MBVersionEditor.ReplacePrefab(copyOfInput, assetPath, MB_ReplacePrefabOption.connectToPrefab | MB_ReplacePrefabOption.nameBased); PrefabUtility.ReplacePrefab(copyOfInput, bwc.outputPrefab, ReplacePrefabOptions.ConnectToPrefab | ReplacePrefabOptions.ReplaceNameBased); AssetDatabase.SaveAssets(); DestroyImmediate(copyOfInput); }