DungeonGeneratorWindow.cs 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. using UnityEditor;
  2. using UnityEngine;
  3. namespace DunGen.Editor
  4. {
  5. public sealed class DungeonGeneratorWindow : EditorWindow
  6. {
  7. private class SerializedDungeonGeneratorContainer : ScriptableObject
  8. {
  9. public DungeonGenerator generator;
  10. }
  11. private SerializedDungeonGeneratorContainer container;
  12. private SerializedObject serializedObject;
  13. private SerializedProperty generatorProperty;
  14. private GameObject lastDungeon;
  15. private bool overwriteExisting = true;
  16. [MenuItem("Window/DunGen/Generate Dungeon")]
  17. private static void OpenWindow()
  18. {
  19. GetWindow<DungeonGeneratorWindow>(false, "New Dungeon", true);
  20. }
  21. private void OnGUI()
  22. {
  23. if (serializedObject == null)
  24. return;
  25. serializedObject.Update();
  26. DungeonGeneratorDrawUtil.DrawDungeonGenerator(generatorProperty, false);
  27. serializedObject.ApplyModifiedProperties();
  28. EditorGUILayout.Space();
  29. overwriteExisting = EditorGUILayout.Toggle("Overwrite Existing?", overwriteExisting);
  30. if (GUILayout.Button("Generate"))
  31. GenerateDungeon();
  32. }
  33. private void OnEnable()
  34. {
  35. // Create a container object to hold our generator
  36. container = ScriptableObject.CreateInstance<SerializedDungeonGeneratorContainer>();
  37. container.generator = new DungeonGenerator
  38. {
  39. AllowTilePooling = false
  40. };
  41. // Setup serialization
  42. serializedObject = new SerializedObject(container);
  43. generatorProperty = serializedObject.FindProperty("generator");
  44. container.generator.OnGenerationStatusChanged += HandleGenerationStatusChanged;
  45. }
  46. private void OnDisable()
  47. {
  48. if (container != null && container.generator != null)
  49. container.generator.OnGenerationStatusChanged -= HandleGenerationStatusChanged;
  50. if (container != null)
  51. DestroyImmediate(container);
  52. container = null;
  53. serializedObject = null;
  54. generatorProperty = null;
  55. }
  56. private void GenerateDungeon()
  57. {
  58. if (lastDungeon != null)
  59. {
  60. if (overwriteExisting)
  61. UnityUtil.Destroy(lastDungeon);
  62. else
  63. container.generator.DetachDungeon();
  64. }
  65. lastDungeon = new GameObject("Dungeon Layout");
  66. container.generator.Root = lastDungeon;
  67. Undo.RegisterCreatedObjectUndo(lastDungeon, "Create Procedural Dungeon");
  68. container.generator.GenerateAsynchronously = false;
  69. container.generator.Generate();
  70. }
  71. private void HandleGenerationStatusChanged(DungeonGenerator generator, GenerationStatus status)
  72. {
  73. if (status == GenerationStatus.Failed)
  74. {
  75. UnityUtil.Destroy(lastDungeon);
  76. lastDungeon = container.generator.Root = null;
  77. }
  78. }
  79. }
  80. }