using UnityEditor; using UnityEditor.ShortcutManagement; using UnityEngine; public class ConvertToMeshAsset : EditorWindow { [Shortcut("Convert To Mesh Asset", KeyCode.Z, ShortcutModifiers.Shift)] private static void Shortcut() => OpenWindow(); private static void CreateAsset(Transform child, Transform parent, string path, string selectionName) { // TODO: do some error handling here MeshFilter mf = child.GetComponent(); Mesh m = mf.sharedMesh; Mesh meshToSave = UnityEngine.Object.Instantiate(m); GameObject childObject = new GameObject(mf.name, typeof(MeshFilter), typeof(MeshRenderer)); childObject.GetComponent().mesh = meshToSave; childObject.GetComponent().material = child.GetComponent().sharedMaterial; childObject.transform.parent = parent; AssetDatabase.CreateAsset(meshToSave, path + "/" + selectionName + "/mesh/" + selectionName + "_" + mf.name + ".asset"); AssetDatabase.SaveAssets(); } private static void OpenWindow() { // var selection = Selection.activeObject; var selections = Selection.gameObjects; // TODO: do some error handling here string path = EditorUtility.SaveFolderPanel("Save Separate Mesh Asset", "Assets/", ""); if (string.IsNullOrEmpty(path)) return; path = FileUtil.GetProjectRelativePath(path); foreach (var selection in selections) { // TODO: do some error handling here AssetDatabase.CreateFolder(path, selection.name); AssetDatabase.CreateFolder(path + "/" + selection.name , "mesh"); GameObject prefabObject = new GameObject(selection.name); foreach(Transform item in ((GameObject)selection).transform) { if (item.childCount > 0) { GameObject childObject = new GameObject(item.name); childObject.transform.parent = prefabObject.transform; foreach (Transform child in item) { CreateAsset(child, childObject.transform, path, selection.name); } } else { CreateAsset(item, prefabObject.transform, path, selection.name); } } PrefabUtility.SaveAsPrefabAsset(prefabObject, path + "/" + selection.name + "/" + selection.name + ".prefab"); foreach(Transform child in prefabObject.transform) { DestroyImmediate(child.gameObject); } DestroyImmediate(prefabObject); } } }