VoxelBaseExplosionEditor.cs 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469
  1. using UnityEngine;
  2. using UnityEngine.Assertions;
  3. using UnityEditor;
  4. using UnityEditorInternal;
  5. using UnityEditor.SceneManagement;
  6. using System;
  7. using System.IO;
  8. using System.Linq;
  9. using System.Collections;
  10. using System.Collections.Generic;
  11. #if UNITY_2018_3_OR_NEWER
  12. using UnityEditor.Experimental.SceneManagement;
  13. #endif
  14. namespace VoxelImporter
  15. {
  16. public abstract class VoxelBaseExplosionEditor : EditorCommon
  17. {
  18. public VoxelBaseExplosion explosionBase { get; protected set; }
  19. public VoxelBaseExplosionCore explosionCore { get; protected set; }
  20. #region Textures
  21. private Texture2D playIcon;
  22. #endregion
  23. #region GUIStyle
  24. protected GUIStyle guiStyleMagentaBold;
  25. protected GUIStyle guiStyleRedBold;
  26. protected GUIStyle guiStyleFoldoutBold;
  27. protected GUIStyle guiStylePlayButton;
  28. protected GUIStyle guiStylePlayButtonActive;
  29. #endregion
  30. #region Prefab
  31. #if UNITY_2018_3_OR_NEWER
  32. protected PrefabAssetType prefabType { get { return PrefabUtility.GetPrefabAssetType(explosionBase.gameObject); } }
  33. protected bool prefabEnable { get { return prefabType == PrefabAssetType.Regular || isPrefabEditMode; } }
  34. protected bool isPrefab { get { return false; } }
  35. protected bool isPrefabEditMode { get { return PrefabStageUtility.GetCurrentPrefabStage() != null && PrefabStageUtility.GetCurrentPrefabStage().prefabContentsRoot != null; } }
  36. #else
  37. protected PrefabType prefabType { get { return PrefabUtility.GetPrefabType(explosionBase.gameObject); } }
  38. protected bool prefabEnable { get { var type = prefabType; return type == PrefabType.Prefab || type == PrefabType.PrefabInstance || type == PrefabType.DisconnectedPrefabInstance; } }
  39. protected bool isPrefab { get { return prefabType == PrefabType.Prefab; } }
  40. #endif
  41. #endregion
  42. protected virtual void OnEnable()
  43. {
  44. explosionBase = target as VoxelBaseExplosion;
  45. if (explosionBase == null) return;
  46. #region Textures
  47. playIcon = EditorGUIUtility.Load("icons/animation.play.png") as Texture2D;
  48. #endregion
  49. EditorApplication.update -= Update;
  50. EditorApplication.update += Update;
  51. }
  52. protected virtual void OnDisable()
  53. {
  54. if (explosionBase == null) return;
  55. ForceRepaint();
  56. explosionBase.edit_explosionDraw = false;
  57. EditorApplication.update -= Update;
  58. }
  59. protected virtual void OnEnableInitializeSet()
  60. {
  61. #region Auto Generate
  62. if (explosionBase.edit_autoGenerate && explosionCore.voxelBaseCore.IsVoxelFileExists())
  63. {
  64. if (explosionBase.edit_fileRefreshLastTimeTicks != explosionCore.voxelBase.fileRefreshLastTimeTicks)
  65. {
  66. explosionCore.Generate();
  67. }
  68. }
  69. #endregion
  70. }
  71. protected virtual void GUIStyleReady()
  72. {
  73. if (guiStyleMagentaBold == null)
  74. guiStyleMagentaBold = new GUIStyle(EditorStyles.boldLabel);
  75. guiStyleMagentaBold.normal.textColor = Color.magenta;
  76. if (guiStyleRedBold == null)
  77. guiStyleRedBold = new GUIStyle(EditorStyles.boldLabel);
  78. guiStyleRedBold.normal.textColor = Color.red;
  79. if (guiStyleFoldoutBold == null)
  80. guiStyleFoldoutBold = new GUIStyle(EditorStyles.foldout);
  81. if (guiStyleFoldoutBold == null)
  82. guiStyleFoldoutBold = new GUIStyle(EditorStyles.foldout);
  83. guiStyleFoldoutBold.fontStyle = FontStyle.Bold;
  84. if (guiStylePlayButton == null)
  85. guiStylePlayButton = new GUIStyle(GUI.skin.button);
  86. guiStylePlayButton.padding = new RectOffset();
  87. if (guiStylePlayButtonActive == null)
  88. guiStylePlayButtonActive = new GUIStyle(GUI.skin.button);
  89. guiStylePlayButtonActive.padding = new RectOffset();
  90. guiStylePlayButtonActive.normal = guiStylePlayButtonActive.active;
  91. }
  92. public override void OnInspectorGUI()
  93. {
  94. if (explosionBase == null || explosionCore == null)
  95. {
  96. DrawDefaultInspector();
  97. return;
  98. }
  99. #if UNITY_2018_3_OR_NEWER
  100. {
  101. if (prefabType == PrefabAssetType.Regular && !isPrefabEditMode)
  102. {
  103. EditorGUILayout.HelpBox("Prefab can only be edited in Prefab mode.", MessageType.Info);
  104. EditorGUI.BeginDisabledGroup(true);
  105. }
  106. }
  107. #endif
  108. GUIStyleReady();
  109. serializedObject.Update();
  110. #region Generate
  111. {
  112. explosionBase.edit_generateFoldout = EditorGUILayout.Foldout(explosionBase.edit_generateFoldout, "Generate", guiStyleFoldoutBold);
  113. if (explosionBase.edit_generateFoldout)
  114. {
  115. EditorGUILayout.BeginHorizontal(GUI.skin.box);
  116. EditorGUILayout.BeginVertical();
  117. {
  118. #region Settings
  119. {
  120. EditorGUILayout.LabelField("Settings", EditorStyles.boldLabel);
  121. {
  122. EditorGUI.indentLevel++;
  123. #region BirthRate
  124. {
  125. EditorGUI.BeginChangeCheck();
  126. var edit_birthRate = EditorGUILayout.Slider("Birth Rate", explosionBase.edit_birthRate, 0f, 1f);
  127. if (EditorGUI.EndChangeCheck())
  128. {
  129. Undo.RecordObject(explosionBase, "Inspector");
  130. explosionBase.edit_birthRate = edit_birthRate;
  131. if (explosionBase.edit_autoGenerate)
  132. {
  133. explosionCore.Generate();
  134. ForceRepaint();
  135. }
  136. }
  137. }
  138. #endregion
  139. #region VisibleOnly
  140. {
  141. EditorGUI.BeginChangeCheck();
  142. var edit_visibleOnly = EditorGUILayout.Toggle("Visible Only", explosionBase.edit_visibleOnly);
  143. if (EditorGUI.EndChangeCheck())
  144. {
  145. Undo.RecordObject(explosionBase, "Inspector");
  146. explosionBase.edit_visibleOnly = edit_visibleOnly;
  147. if (explosionBase.edit_autoGenerate)
  148. {
  149. explosionCore.Generate();
  150. ForceRepaint();
  151. }
  152. }
  153. }
  154. #endregion
  155. #region Velocity
  156. {
  157. {
  158. var min = explosionBase.edit_velocityMin;
  159. var max = explosionBase.edit_velocityMax;
  160. EditorGUI.BeginChangeCheck();
  161. EditorGUILayout.MinMaxSlider(new GUIContent("Velocity"), ref min, ref max, 0f, 300f);
  162. if (EditorGUI.EndChangeCheck())
  163. {
  164. Undo.RecordObject(explosionBase, "Inspector");
  165. explosionBase.edit_velocityMin = min;
  166. explosionBase.edit_velocityMax = max;
  167. if (explosionBase.edit_autoGenerate)
  168. {
  169. explosionCore.Generate();
  170. ForceRepaint();
  171. }
  172. }
  173. }
  174. EditorGUI.indentLevel++;
  175. {
  176. EditorGUI.BeginChangeCheck();
  177. var edit_velocityMin = EditorGUILayout.FloatField("Min", explosionBase.edit_velocityMin);
  178. if (EditorGUI.EndChangeCheck())
  179. {
  180. Undo.RecordObject(explosionBase, "Inspector");
  181. edit_velocityMin = Mathf.Clamp(edit_velocityMin, 0f, 300f);
  182. edit_velocityMin = Mathf.Min(edit_velocityMin, explosionBase.edit_velocityMax);
  183. explosionBase.edit_velocityMin = edit_velocityMin;
  184. if (explosionBase.edit_autoGenerate)
  185. {
  186. explosionCore.Generate();
  187. ForceRepaint();
  188. }
  189. }
  190. }
  191. {
  192. EditorGUI.BeginChangeCheck();
  193. var edit_velocityMax = EditorGUILayout.FloatField("Max", explosionBase.edit_velocityMax);
  194. if (EditorGUI.EndChangeCheck())
  195. {
  196. Undo.RecordObject(explosionBase, "Inspector");
  197. edit_velocityMax = Mathf.Clamp(edit_velocityMax, 0f, 300f);
  198. edit_velocityMax = Mathf.Max(edit_velocityMax, explosionBase.edit_velocityMin);
  199. explosionBase.edit_velocityMax = edit_velocityMax;
  200. if (explosionBase.edit_autoGenerate)
  201. {
  202. explosionCore.Generate();
  203. ForceRepaint();
  204. }
  205. }
  206. }
  207. EditorGUI.indentLevel--;
  208. }
  209. #endregion
  210. EditorGUI.indentLevel--;
  211. }
  212. }
  213. #endregion
  214. Inspector_MeshMaterial();
  215. EditorGUILayout.Space();
  216. #region Generate
  217. {
  218. EditorGUILayout.BeginHorizontal();
  219. if (GUILayout.Button("Generate"))
  220. {
  221. Undo.RecordObject(explosionBase, "Generate Voxel Explosion");
  222. explosionCore.Generate();
  223. ForceRepaint();
  224. }
  225. {
  226. EditorGUI.BeginChangeCheck();
  227. var edit_autoGenerate = EditorGUILayout.ToggleLeft("Auto", explosionBase.edit_autoGenerate, GUILayout.Width(48f));
  228. if (EditorGUI.EndChangeCheck())
  229. {
  230. Undo.RecordObject(explosionBase, "Inspector");
  231. explosionBase.edit_autoGenerate = edit_autoGenerate;
  232. if (explosionBase.edit_autoGenerate)
  233. {
  234. explosionCore.Generate();
  235. ForceRepaint();
  236. }
  237. }
  238. }
  239. EditorGUILayout.EndHorizontal();
  240. }
  241. #endregion
  242. }
  243. EditorGUILayout.EndVertical();
  244. EditorGUILayout.EndHorizontal();
  245. }
  246. }
  247. #endregion
  248. #region Bake
  249. Inspector_Bake();
  250. #endregion
  251. #region Settings
  252. {
  253. explosionBase.edit_settingsFoldout = EditorGUILayout.Foldout(explosionBase.edit_settingsFoldout, "Settings", guiStyleFoldoutBold);
  254. if (explosionBase.edit_settingsFoldout)
  255. {
  256. EditorGUILayout.BeginHorizontal(GUI.skin.box);
  257. EditorGUILayout.BeginVertical();
  258. {
  259. #region Auto Set Explosion Center
  260. {
  261. EditorGUI.BeginChangeCheck();
  262. var edit_autoSetExplosionCenter = EditorGUILayout.Toggle("Auto Set Explosion Center", explosionBase.edit_autoSetExplosionCenter);
  263. if (EditorGUI.EndChangeCheck())
  264. {
  265. Undo.RecordObject(explosionBase, "Inspector");
  266. explosionBase.edit_autoSetExplosionCenter = edit_autoSetExplosionCenter;
  267. explosionCore.SetExplosionCenter();
  268. ForceRepaint();
  269. }
  270. }
  271. #endregion
  272. #region Explosion Center
  273. if (!explosionBase.edit_autoSetExplosionCenter)
  274. {
  275. EditorGUI.indentLevel++;
  276. EditorGUI.BeginChangeCheck();
  277. var explosionCenter = EditorGUILayout.Vector3Field("Explosion Center", explosionBase.explosionCenter);
  278. if (EditorGUI.EndChangeCheck())
  279. {
  280. Undo.RecordObject(explosionBase, "Inspector");
  281. explosionBase.explosionCenter = explosionCenter;
  282. explosionCore.SetExplosionCenter();
  283. ForceRepaint();
  284. }
  285. EditorGUI.indentLevel--;
  286. }
  287. #endregion
  288. #region Explosion Rotate
  289. {
  290. EditorGUI.BeginChangeCheck();
  291. var explosionRotate = EditorGUILayout.Slider("Explosion Rotate", explosionBase.explosionRotate, 0f, 10f);
  292. if (EditorGUI.EndChangeCheck())
  293. {
  294. Undo.RecordObject(explosionBase, "Inspector");
  295. explosionBase.explosionRotate = explosionRotate;
  296. explosionBase.SetExplosionRotate(explosionBase.explosionRotate);
  297. ForceRepaint();
  298. }
  299. }
  300. #endregion
  301. }
  302. EditorGUILayout.EndVertical();
  303. EditorGUILayout.EndHorizontal();
  304. }
  305. }
  306. #endregion
  307. #if UNITY_2018_3_OR_NEWER
  308. {
  309. if (prefabType == PrefabAssetType.Regular && !isPrefabEditMode)
  310. {
  311. EditorGUI.EndDisabledGroup();
  312. }
  313. }
  314. #endif
  315. #region Preview
  316. #if UNITY_2018_3_OR_NEWER
  317. EditorGUI.BeginDisabledGroup(isPrefabEditMode); //Is Graphics.DrawMesh not displayed in Prefab Mode? (at Unity2018.2.0b7)
  318. #else
  319. EditorGUI.BeginDisabledGroup(isPrefab);
  320. #endif
  321. {
  322. explosionBase.edit_previewFoldout = EditorGUILayout.Foldout(explosionBase.edit_previewFoldout, "Preview", guiStyleFoldoutBold);
  323. if (explosionBase.edit_previewFoldout)
  324. {
  325. EditorGUI.BeginDisabledGroup(EditorApplication.isPlaying);
  326. EditorGUILayout.BeginHorizontal(GUI.skin.box);
  327. EditorGUILayout.BeginVertical();
  328. {
  329. EditorGUI.BeginChangeCheck();
  330. var edit_explosionLifeTime = EditorGUILayout.Slider("Life Time", explosionBase.edit_explosionLifeTime, 0f, 10f);
  331. if (EditorGUI.EndChangeCheck())
  332. {
  333. Undo.RecordObject(explosionBase, "Inspector");
  334. explosionBase.edit_explosionLifeTime = edit_explosionLifeTime;
  335. explosionBase.edit_explosionPlay = false;
  336. explosionBase.SetExplosionRate(explosionBase.edit_explosionRate);
  337. ForceRepaint();
  338. }
  339. }
  340. {
  341. EditorGUILayout.BeginHorizontal();
  342. {
  343. EditorGUI.BeginChangeCheck();
  344. var edit_explosionTime = EditorGUILayout.Slider("Time Line", explosionBase.edit_explosionTime, 0f, explosionBase.edit_explosionLifeTime);
  345. if (EditorGUI.EndChangeCheck())
  346. {
  347. Undo.RecordObject(explosionBase, "Inspector");
  348. explosionBase.edit_explosionTime = edit_explosionTime;
  349. explosionBase.edit_explosionPlay = false;
  350. ForceRepaint();
  351. }
  352. }
  353. {
  354. if (GUILayout.Button(playIcon, explosionBase.edit_explosionPlay ? guiStylePlayButtonActive : guiStylePlayButton))
  355. {
  356. explosionBase.edit_explosionPlay = !explosionBase.edit_explosionPlay;
  357. }
  358. }
  359. EditorGUILayout.EndHorizontal();
  360. }
  361. EditorGUILayout.EndVertical();
  362. EditorGUILayout.EndHorizontal();
  363. EditorGUI.EndDisabledGroup();
  364. }
  365. if (!EditorApplication.isPlaying)
  366. {
  367. explosionBase.SetExplosionRate(explosionBase.edit_explosionRate);
  368. }
  369. }
  370. EditorGUI.EndDisabledGroup();
  371. #endregion
  372. serializedObject.ApplyModifiedProperties();
  373. }
  374. protected virtual void Inspector_MeshMaterial() { }
  375. protected virtual void Inspector_Bake() { }
  376. protected virtual void OnSceneGUI()
  377. {
  378. if (explosionBase == null || explosionCore == null) return;
  379. #region Play
  380. if (explosionBase.edit_explosionPlay)
  381. {
  382. if (explosionBase.edit_explosionTime < explosionBase.edit_explosionLifeTime)
  383. {
  384. explosionBase.edit_explosionTime += Time.fixedDeltaTime;
  385. explosionBase.edit_explosionTime = Mathf.Min(explosionBase.edit_explosionTime, explosionBase.edit_explosionLifeTime);
  386. }
  387. else
  388. {
  389. explosionBase.edit_explosionTime = 0f;
  390. explosionBase.edit_explosionPlay = false;
  391. explosionBase.edit_explosionDraw = false;
  392. }
  393. }
  394. #endregion
  395. #region Draw
  396. if (explosionBase.edit_explosionPlay || explosionBase.edit_explosionDraw)
  397. {
  398. explosionCore.SetExplosionCenter();
  399. explosionBase.SetExplosionRate(explosionBase.edit_explosionRate);
  400. explosionBase.DrawMesh();
  401. }
  402. #endregion
  403. }
  404. private void Update()
  405. {
  406. if (explosionBase == null || explosionCore == null) return;
  407. #region Auto Generate
  408. if (explosionBase.edit_autoGenerate && explosionCore.voxelBaseCore.IsVoxelFileExists())
  409. {
  410. if (explosionBase.edit_fileRefreshLastTimeTicks != explosionCore.voxelBase.fileRefreshLastTimeTicks)
  411. {
  412. explosionCore.Generate();
  413. }
  414. }
  415. #endregion
  416. #region Draw
  417. if (explosionBase.edit_explosionPlay)
  418. {
  419. Repaint();
  420. }
  421. if (explosionBase.edit_explosionPlay || explosionBase.edit_explosionDraw)
  422. {
  423. ForceRepaint();
  424. }
  425. #endregion
  426. }
  427. protected void ForceRepaint()
  428. {
  429. if (explosionBase == null) return;
  430. explosionBase.enabled = !explosionBase.enabled;
  431. explosionBase.enabled = !explosionBase.enabled;
  432. explosionBase.edit_explosionDraw = true;
  433. }
  434. }
  435. }