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 ChunkedMazeRenderer chunkedRenderer;
[SerializeField] private MeshMazeRenderer meshMazeRenderer;
private MazeData currentMaze;
private MazeGenerator generator;
void Start()
{
if (mazeRenderer == null)
{
mazeRenderer = GetComponent() ?? FindFirstObjectByType();
}
if (chunkedRenderer == null)
{
chunkedRenderer = GetComponent() ?? FindFirstObjectByType();
}
if (meshMazeRenderer == null)
{
meshMazeRenderer = GetComponent() ?? FindFirstObjectByType();
}
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 (chunkedRenderer != null)
{
chunkedRenderer.RefreshVisibleChunks();
}
if (meshMazeRenderer != null)
{
meshMazeRenderer.RefreshMesh();
}
}
///
/// 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 chunkedRenderer = GetComponent();
if (chunkedRenderer != null)
{
chunkedRenderer.RefreshVisibleChunks();
}
var meshRenderer = GetComponent();
if (meshRenderer != null)
{
meshRenderer.RefreshMesh();
}
}
///
/// 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();
}
void Update()
{
// Can be used for real-time generation or maze editing later
}
}