VoxelObjectExplosionEditor.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. using UnityEngine;
  2. using UnityEngine.Assertions;
  3. using UnityEditor;
  4. using UnityEditorInternal;
  5. using System;
  6. using System.IO;
  7. using System.Collections;
  8. using System.Collections.Generic;
  9. namespace VoxelImporter
  10. {
  11. [CustomEditor(typeof(VoxelObjectExplosion))]
  12. public class VoxelObjectExplosionEditor : VoxelBaseExplosionEditor
  13. {
  14. public VoxelObjectExplosion explosionObject { get; protected set; }
  15. public VoxelObjectExplosionCore explosionObjectCore { get; protected set; }
  16. protected override void OnEnable()
  17. {
  18. base.OnEnable();
  19. explosionBase = explosionObject = target as VoxelObjectExplosion;
  20. if (explosionObject == null) return;
  21. explosionCore = explosionObjectCore = new VoxelObjectExplosionCore(explosionObject);
  22. if (explosionCore.voxelBase == null)
  23. {
  24. Undo.DestroyObjectImmediate(explosionBase);
  25. return;
  26. }
  27. OnEnableInitializeSet();
  28. }
  29. protected override void Inspector_MeshMaterial()
  30. {
  31. #region Mesh
  32. {
  33. if (explosionObject.meshes != null)
  34. {
  35. if (prefabEnable)
  36. {
  37. bool contains = true;
  38. for (int i = 0; i < explosionObject.meshes.Count; i++)
  39. {
  40. if (explosionObject.meshes[i] == null || explosionObject.meshes[i].mesh == null || !AssetDatabase.Contains(explosionObject.meshes[i].mesh))
  41. contains = false;
  42. }
  43. EditorGUILayout.LabelField("Mesh", contains ? EditorStyles.boldLabel : guiStyleRedBold);
  44. }
  45. else
  46. {
  47. EditorGUILayout.LabelField("Mesh", EditorStyles.boldLabel);
  48. }
  49. }
  50. else
  51. {
  52. EditorGUILayout.LabelField("Mesh", guiStyleMagentaBold);
  53. }
  54. {
  55. EditorGUI.indentLevel++;
  56. {
  57. if (explosionObject.meshes != null)
  58. {
  59. for (int i = 0; i < explosionObject.meshes.Count; i++)
  60. {
  61. EditorGUILayout.BeginHorizontal();
  62. {
  63. EditorGUI.BeginDisabledGroup(true);
  64. EditorGUILayout.ObjectField(explosionObject.meshes[i].mesh, typeof(Mesh), false);
  65. EditorGUI.EndDisabledGroup();
  66. }
  67. if (explosionObject.meshes[i] != null && explosionObject.meshes[i].mesh != null)
  68. {
  69. if (!IsMainAsset(explosionObject.meshes[i].mesh))
  70. {
  71. if (GUILayout.Button("Save", GUILayout.Width(48), GUILayout.Height(16)))
  72. {
  73. #region Create Mesh
  74. string path = EditorUtility.SaveFilePanel("Save mesh", explosionCore.voxelBaseCore.GetDefaultPath(), string.Format("{0}_explosion_mesh{1}.asset", explosionObject.gameObject.name, i), "asset");
  75. if (!string.IsNullOrEmpty(path))
  76. {
  77. if (path.IndexOf(Application.dataPath) < 0)
  78. {
  79. SaveInsideAssetsFolderDisplayDialog();
  80. }
  81. else
  82. {
  83. Undo.RecordObject(explosionObject, "Save Mesh");
  84. path = path.Replace(Application.dataPath, "Assets");
  85. AssetDatabase.CreateAsset(Mesh.Instantiate(explosionObject.meshes[i].mesh), path);
  86. explosionObject.meshes[i].mesh = AssetDatabase.LoadAssetAtPath<Mesh>(path);
  87. explosionCore.Generate();
  88. }
  89. }
  90. #endregion
  91. }
  92. }
  93. {
  94. if (GUILayout.Button("Reset", GUILayout.Width(48), GUILayout.Height(16)))
  95. {
  96. #region Reset Mesh
  97. Undo.RecordObject(explosionObject, "Reset Mesh");
  98. explosionObject.meshes[i].mesh = null;
  99. explosionCore.Generate();
  100. #endregion
  101. }
  102. }
  103. }
  104. EditorGUILayout.EndHorizontal();
  105. }
  106. }
  107. }
  108. EditorGUI.indentLevel--;
  109. }
  110. }
  111. #endregion
  112. #region Material
  113. {
  114. if (explosionObject.materials != null)
  115. {
  116. if (prefabEnable)
  117. {
  118. bool contains = true;
  119. for (int i = 0; i < explosionObject.materials.Count; i++)
  120. {
  121. if (explosionObject.materials[i] == null || !AssetDatabase.Contains(explosionObject.materials[i]))
  122. contains = false;
  123. }
  124. EditorGUILayout.LabelField("Material", contains ? EditorStyles.boldLabel : guiStyleRedBold);
  125. }
  126. else
  127. {
  128. EditorGUILayout.LabelField("Material", EditorStyles.boldLabel);
  129. }
  130. }
  131. else
  132. {
  133. EditorGUILayout.LabelField("Material", guiStyleMagentaBold);
  134. }
  135. {
  136. EditorGUI.indentLevel++;
  137. {
  138. if (explosionObject.materials != null)
  139. {
  140. for (int i = 0; i < explosionObject.materials.Count; i++)
  141. {
  142. EditorGUILayout.BeginHorizontal();
  143. {
  144. EditorGUI.BeginDisabledGroup(true);
  145. EditorGUILayout.ObjectField(explosionObject.materials[i], typeof(Material), false);
  146. EditorGUI.EndDisabledGroup();
  147. }
  148. if (explosionObject.materials[i] != null)
  149. {
  150. if (!IsMainAsset(explosionObject.materials[i]))
  151. {
  152. if (GUILayout.Button("Save", GUILayout.Width(48), GUILayout.Height(16)))
  153. {
  154. #region Create Material
  155. string path = EditorUtility.SaveFilePanel("Save material", explosionCore.voxelBaseCore.GetDefaultPath(), string.Format("{0}_explosion_mat{1}.mat", explosionObject.gameObject.name, i), "mat");
  156. if (!string.IsNullOrEmpty(path))
  157. {
  158. if (path.IndexOf(Application.dataPath) < 0)
  159. {
  160. SaveInsideAssetsFolderDisplayDialog();
  161. }
  162. else
  163. {
  164. Undo.RecordObject(explosionObject, "Save Material");
  165. path = path.Replace(Application.dataPath, "Assets");
  166. AssetDatabase.CreateAsset(Material.Instantiate(explosionObject.materials[i]), path);
  167. explosionObject.materials[i] = AssetDatabase.LoadAssetAtPath<Material>(path);
  168. explosionCore.Generate();
  169. }
  170. }
  171. #endregion
  172. }
  173. }
  174. {
  175. if (GUILayout.Button("Reset", GUILayout.Width(48), GUILayout.Height(16)))
  176. {
  177. #region Reset Material
  178. Undo.RecordObject(explosionObject, "Reset Material");
  179. if (!IsMainAsset(explosionObject.materials[i]))
  180. explosionObject.materials[i] = null;
  181. else
  182. explosionObject.materials[i] = Instantiate<Material>(explosionObject.materials[i]);
  183. explosionCore.Generate();
  184. #endregion
  185. }
  186. }
  187. }
  188. EditorGUILayout.EndHorizontal();
  189. }
  190. }
  191. }
  192. EditorGUI.indentLevel--;
  193. }
  194. }
  195. #endregion
  196. }
  197. [MenuItem("CONTEXT/VoxelObjectExplosion/Save All Unsaved Assets")]
  198. private static void ContextSaveAllUnsavedAssets(MenuCommand menuCommand)
  199. {
  200. var explosionObject = menuCommand.context as VoxelObjectExplosion;
  201. if (explosionObject == null) return;
  202. var explosionCore = new VoxelObjectExplosionCore(explosionObject);
  203. var folder = EditorUtility.OpenFolderPanel("Save all", explosionCore.voxelBaseCore.GetDefaultPath(), null);
  204. if (string.IsNullOrEmpty(folder)) return;
  205. if (folder.IndexOf(Application.dataPath) < 0)
  206. {
  207. SaveInsideAssetsFolderDisplayDialog();
  208. return;
  209. }
  210. Undo.RecordObject(explosionObject, "Save All Unsaved Assets");
  211. #region Mesh
  212. if (explosionObject.meshes != null)
  213. {
  214. for (int i = 0; i < explosionObject.meshes.Count; i++)
  215. {
  216. if (explosionObject.meshes[i] != null && explosionObject.meshes[i].mesh != null && !IsMainAsset(explosionObject.meshes[i].mesh))
  217. {
  218. var path = folder + "/" + string.Format("{0}_explosion_mesh{1}.asset", explosionObject.gameObject.name, i);
  219. path = path.Replace(Application.dataPath, "Assets");
  220. path = AssetDatabase.GenerateUniqueAssetPath(path);
  221. AssetDatabase.CreateAsset(Mesh.Instantiate(explosionObject.meshes[i].mesh), path);
  222. explosionObject.meshes[i].mesh = AssetDatabase.LoadAssetAtPath<Mesh>(path);
  223. }
  224. }
  225. }
  226. #endregion
  227. #region Material
  228. if (explosionObject.materials != null)
  229. {
  230. for (int index = 0; index < explosionObject.materials.Count; index++)
  231. {
  232. if (explosionObject.materials[index] == null) continue;
  233. if (IsMainAsset(explosionObject.materials[index])) continue;
  234. var path = folder + "/" + string.Format("{0}_explosion_mat{1}.mat", explosionObject.gameObject.name, index);
  235. path = path.Replace(Application.dataPath, "Assets");
  236. path = AssetDatabase.GenerateUniqueAssetPath(path);
  237. AssetDatabase.CreateAsset(Material.Instantiate(explosionObject.materials[index]), path);
  238. explosionObject.materials[index] = AssetDatabase.LoadAssetAtPath<Material>(path);
  239. }
  240. }
  241. #endregion
  242. explosionCore.Generate();
  243. InternalEditorUtility.RepaintAllViews();
  244. }
  245. [MenuItem("CONTEXT/VoxelObjectExplosion/Reset All Assets")]
  246. private static void ResetAllSavedAssets(MenuCommand menuCommand)
  247. {
  248. var explosionObject = menuCommand.context as VoxelObjectExplosion;
  249. if (explosionObject == null) return;
  250. var explosionCore = new VoxelObjectExplosionCore(explosionObject);
  251. Undo.RecordObject(explosionObject, "Reset All Assets");
  252. #region Mesh
  253. explosionObject.meshes = null;
  254. #endregion
  255. #region Material
  256. if (explosionObject.materials != null)
  257. {
  258. for (int i = 0; i < explosionObject.materials.Count; i++)
  259. {
  260. if (explosionObject.materials[i] == null) continue;
  261. if (!IsMainAsset(explosionObject.materials[i]))
  262. explosionObject.materials[i] = null;
  263. else
  264. explosionObject.materials[i] = Instantiate<Material>(explosionObject.materials[i]);
  265. }
  266. }
  267. #endregion
  268. explosionCore.Generate();
  269. InternalEditorUtility.RepaintAllViews();
  270. }
  271. }
  272. }