using System.Collections.Generic; using UnityEngine; using System.Linq; public class MapGenManager : MonoBehaviour { [Header("Room Prefabs")] [SerializeField] private List mapPrefab = new List(); [SerializeField] private GameObject StartPoint; [SerializeField] private GameObject EndPoint; [Header("Player")] [SerializeField] private GameObject Player; [Header("Corridor Prefabs")] [SerializeField] private GameObject CorridorStraight; /*[SerializeField] private GameObject CorridorL; [SerializeField] private GameObject CorridorT; [SerializeField] private GameObject CorridorCross; [SerializeField] private GameObject CorridorEnd;*/ [Header("Generation Settings")] [SerializeField] private int RoomDistance = 5; [SerializeField] private int minRoomsNumber = 3; [SerializeField] private int maxRoomsNumber = 7; private List roomPositions = new List(); private List placedRooms = new List(); void Start() { MapGen(); } private void MapGen() { // Clear previous rooms and positions roomPositions.Clear(); placedRooms.Clear(); // Add Start Point Vector3 startPos = new Vector3(0, 0, 0); GameObject startPoint = Instantiate(StartPoint, startPos, Quaternion.identity, transform); roomPositions.Add(startPos); placedRooms.Add(startPoint); // Instantiate the player at the starting position GameObject player = Instantiate(Player, new Vector3(startPos.x, 1, startPos.z), Quaternion.identity, transform); // Generate a random number of rooms int roomCount = Random.Range(minRoomsNumber, maxRoomsNumber); // Place Generate Rooms for (int i = 0; i < roomCount; i++) { Vector3 roomPos = GetGridPosition(); GameObject roomPrefab = mapPrefab[Random.Range(0, mapPrefab.Count)]; GameObject room = Instantiate(roomPrefab, roomPos, Quaternion.identity, transform); placedRooms.Add(room); roomPositions.Add(roomPos); } // Add End Point GameObject endPoint = Instantiate(EndPoint, GetGridPosition(), Quaternion.identity, transform); roomPositions.Add(endPoint.transform.position); placedRooms.Add(endPoint); // Create corridors between rooms for (int i = 0; i < roomPositions.Count - 1; i++) { Vector3 startRoomPos = roomPositions[i]; PrefabSize startRoom = placedRooms[i].GetComponent(); Vector3 endRoomPos = roomPositions[i + 1]; PrefabSize endRoom = placedRooms[i + 1].GetComponent(); Vector3 firstCorridorPos = new Vector3( startRoomPos.x + startRoom.prefabSize.x / 2, startRoomPos.y, startRoomPos.z ); Vector3 lastCorridorPos = new Vector3( endRoomPos.x - endRoom.prefabSize.x / 2, endRoomPos.y, endRoomPos.z ); CreateCorridor(firstCorridorPos, lastCorridorPos); } } private Vector3 GetGridPosition() { Vector3 lastRoomPos = roomPositions[roomPositions.Count - 1]; // Convert grid units to world position Vector3 roomPos = new Vector3( lastRoomPos.x + RoomDistance, lastRoomPos.y, lastRoomPos.z ); return roomPos; } private void CreateCorridor(Vector3 start, Vector3 end) { // Calculate the distance float distance = Vector3.Distance(start, end); PrefabSize corridorSize = CorridorStraight.GetComponent(); // Calculate the number of corridors needed int corridorCount = Mathf.FloorToInt(distance / corridorSize.prefabSize.x); Debug.Log($"Creating {corridorCount} corridors from {start} to {end}"); // Create corridors for (int i = 0; i < corridorCount; i++) { Vector3 pos = new Vector3( start.x + i * corridorSize.prefabSize.x + corridorSize.prefabSize.x * 0.5f, start.y, start.z ); Quaternion rotation = Quaternion.Euler(0, 90, 0); GameObject corridor = Instantiate(CorridorStraight, pos, rotation, transform); } } }