CombineMeshesEditor.cs 4.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEditor;
  5. using System.Reflection;
  6. using System.IO;
  7. namespace LylekGames {
  8. [CustomEditor(typeof(CombineMeshes))]
  9. public class CombineMeshesEditor : UnityEditor.Editor {
  10. CombineMeshes myCombine;
  11. public void OnEnable()
  12. {
  13. myCombine = (CombineMeshes)target;
  14. myCombine.Start();
  15. }
  16. public override void OnInspectorGUI() {
  17. myCombine = (CombineMeshes)target;
  18. DrawDefaultInspector();
  19. if (myCombine.myMeshFilter.sharedMesh == null)
  20. {
  21. if (GUILayout.Button("Combine Meshes"))
  22. myCombine.EnableMeshNewCollider();
  23. }
  24. if (myCombine.myMeshFilter.sharedMesh != null)
  25. {
  26. if (GUILayout.Button("Save As Prefab (DESTRUCTIVE)"))
  27. SaveMeshData(true);
  28. if (GUILayout.Button("Save As Prefab (Non-Destructive)"))
  29. SaveMeshData(false);
  30. if (GUILayout.Button("Disable Meshes"))
  31. {
  32. myCombine.DisableMesh();
  33. EditorGUIUtility.ExitGUI();
  34. }
  35. }
  36. }
  37. public void SaveMeshData(bool destructive = false)
  38. {
  39. if (PrefabUtility.GetPrefabInstanceStatus(myCombine.gameObject) == PrefabInstanceStatus.Connected)
  40. PrefabUtility.UnpackPrefabInstance(myCombine.gameObject, PrefabUnpackMode.Completely, InteractionMode.AutomatedAction);
  41. if (!Directory.Exists(Application.dataPath + "/MeshCombiner/Prefabs/"))
  42. Directory.CreateDirectory(Application.dataPath + "/MeshCombiner/Prefabs/");
  43. if (!Directory.Exists(Application.dataPath + "/MeshCombiner/MesheData/"))
  44. Directory.CreateDirectory(Application.dataPath + "/MeshCombiner/MesheData/");
  45. AssetDatabase.SaveAssets();
  46. AssetDatabase.Refresh();
  47. //SAVE MESH AND CREATE PREFAB
  48. SaveMesh(myCombine.myMeshFilter, destructive);
  49. Debug.Log("Data saved successfully.");
  50. }
  51. public void SaveMesh(MeshFilter meshFilter, bool destructive = false)
  52. {
  53. //SAVE MESH DATA
  54. AssetDatabase.CreateAsset(meshFilter.sharedMesh, "Assets/MeshCombiner/MesheData/" + meshFilter.gameObject.name + ".asset");
  55. AssetDatabase.SaveAssets();
  56. AssetDatabase.Refresh();
  57. //SET OUR GAMEOBJECT'S MESH DATA AS OUR NEW SAVED MESH DATA
  58. meshFilter.sharedMesh = (Mesh)AssetDatabase.LoadAssetAtPath("Assets/MeshCombiner/MesheData/" + meshFilter.gameObject.name + ".asset", typeof(Mesh));
  59. //REMOVE OUR CHILD OBJECTS
  60. if (destructive)
  61. {
  62. int childCount = meshFilter.gameObject.transform.childCount;
  63. for (int i = 0; i < childCount; i++)
  64. DestroyImmediate(meshFilter.transform.GetChild(0).gameObject);
  65. }
  66. MeshCollider meshCollider = null;
  67. if (!meshFilter.gameObject.GetComponent<MeshCollider>())
  68. meshCollider = meshFilter.gameObject.AddComponent<MeshCollider>();
  69. else
  70. meshCollider = meshFilter.gameObject.GetComponent<MeshCollider>();
  71. meshCollider.sharedMesh = meshFilter.sharedMesh;
  72. //------------------CREATE A PREFAB OF THIS GAMEOBJECT------------------//
  73. PrefabUtility.SaveAsPrefabAssetAndConnect(myCombine.gameObject, "Assets/MeshCombiner/Prefabs/" + meshFilter.gameObject.name + ".prefab", InteractionMode.UserAction);
  74. DestroyImmediate(myCombine);
  75. //REMOVE THE COMBINE SCRIPT FROM OUR PREFAB, WE WON'T BE NEEDING IT ANYMORE
  76. GameObject prefab = (GameObject)AssetDatabase.LoadAssetAtPath("Assets/MeshCombiner/Prefabs/" + meshFilter.gameObject.name + ".prefab", typeof(GameObject));
  77. if (prefab != null)
  78. if (prefab.GetComponent<CombineMeshes>())
  79. DestroyImmediate(prefab.GetComponent<CombineMeshes>(), true);
  80. }
  81. }
  82. }