using UnityEngine; /// /// Main controller for maze generation and management /// public class MazeController : MonoBehaviour { [SerializeField] private MazeConfig mazeConfig = new(); [SerializeField] private bool generateOnStart = true; [SerializeField] private bool visualizeDebug = true; [Header("Renderers")] [SerializeField] private MazeRenderer mazeRenderer; [SerializeField] private MeshMazeRenderer meshMazeRenderer; [Header("AI Agents")] [SerializeField] private bool spawnAIAgents = true; [SerializeField] private AIAgentManager agentManager; [Header("Monsters")] [SerializeField] private MonsterSpawner monsterSpawner; private MazeData currentMaze; private MazeGenerator generator; void Start() { if (mazeRenderer == null) { mazeRenderer = GetComponent() ?? FindAnyObjectByType(); } if (meshMazeRenderer == null) { meshMazeRenderer = GetComponent() ?? FindAnyObjectByType(); } // Setup AI agent manager if (spawnAIAgents) { if (agentManager == null) { agentManager = GetComponent(); } if (agentManager == null) { // Create agent manager if not already present GameObject managerGO = new GameObject("AIAgentManager"); managerGO.transform.parent = transform; agentManager = managerGO.AddComponent(); } } // Find MonsterSpawner if not assigned if (monsterSpawner == null) monsterSpawner = FindAnyObjectByType(); if (generateOnStart) { GenerateMaze(); } } /// /// Generates a new maze using the current configuration /// public void GenerateMaze() { Debug.Log("Generating maze..."); generator = new MazeGenerator(mazeConfig); currentMaze = generator.Generate(); if (visualizeDebug) { VisualizeMaze(); } if (mazeRenderer != null) { mazeRenderer.RenderMaze(); } if (meshMazeRenderer != null) { meshMazeRenderer.RefreshMesh(); } // Bake thread-safe maze snapshot for the pathfinding scheduler if (PathfindingScheduler.Instance == null) { var schedulerGO = new GameObject("PathfindingScheduler"); schedulerGO.transform.parent = transform; schedulerGO.AddComponent(); } PathfindingScheduler.Instance.BakeMaze(currentMaze); // Reset AI agents for new maze if (spawnAIAgents && agentManager != null) { agentManager.ResetForNewMaze(); } // Spawn monsters now that the maze is ready if (monsterSpawner != null) monsterSpawner.SpawnForMaze(currentMaze, mazeConfig); } /// /// Visualizes the maze in the editor/game for debugging /// private void VisualizeMaze() { if (currentMaze == null) return; // Draw grid visualization in Scene view for (int x = 0; x < currentMaze.Width; x += 10) { Debug.DrawLine(new Vector3(x, 0, 0), new Vector3(x, currentMaze.Height, 0), Color.gray); } for (int y = 0; y < currentMaze.Height; y += 10) { Debug.DrawLine(new Vector3(0, y, 0), new Vector3(currentMaze.Width, y, 0), Color.gray); } // Highlight start and exit points foreach (var start in currentMaze.StartPoints) { Debug.DrawLine(new Vector3(start.x - 0.5f, start.y - 0.5f, 0), new Vector3(start.x + 0.5f, start.y + 0.5f, 0), Color.green); } foreach (var exit in currentMaze.ExitPoints) { Debug.DrawLine(new Vector3(exit.x - 0.5f, exit.y - 0.5f, 0), new Vector3(exit.x + 0.5f, exit.y + 0.5f, 0), Color.red); } } /// /// Gets the current maze data /// public MazeData GetCurrentMaze() { return currentMaze; } /// /// Sets the current maze data (used by async generators) /// public void SetCurrentMaze(MazeData maze) { currentMaze = maze; if (visualizeDebug) { VisualizeMaze(); } // Render the maze using available renderers var renderer = GetComponent(); if (renderer != null) { renderer.RenderMaze(); } var meshRenderer = GetComponent(); if (meshRenderer != null) { meshRenderer.RefreshMesh(); } // Reset AI agents for new maze if (spawnAIAgents && agentManager != null) { agentManager.ResetForNewMaze(); } // Spawn monsters for the new maze if (monsterSpawner != null) monsterSpawner.SpawnForMaze(currentMaze, mazeConfig); } /// /// Gets the current maze configuration /// public MazeConfig GetConfig() { return mazeConfig; } /// /// Gets a tile at specific coordinates /// public MazeTile GetTile(int x, int y) { return currentMaze?.GetTile(x, y); } /// /// Checks if a position is walkable /// public bool IsWalkable(int x, int y) { return currentMaze?.IsWalkable(x, y) ?? false; } /// /// Gets the room at a specific tile position /// public MazeRoom GetRoomAtTile(int x, int y) { return currentMaze?.GetRoomAtTile(x, y); } /// /// Gets all start points /// public System.Collections.Generic.List GetStartPoints() { return currentMaze?.StartPoints ?? new(); } /// /// Gets all exit points /// public System.Collections.Generic.List GetExitPoints() { return currentMaze?.ExitPoints ?? new(); } /// /// Gets the AI agent manager /// public AIAgentManager GetAgentManager() { return agentManager; } void Update() { // Can be used for real-time generation or maze editing later } }