OK
To start I would like the rooms to be far away from each other. I want to make it so when u walk from one door you teleport to the door it is ‘connected’ to. How would I do this in procedurally generated rooms?
Ok, so there is a lot.
public enum Direction
{
up = 0,
left = 1,
down = 2,
right = 3
};
public class dungeonCrawlerController : MonoBehaviour
{
public static List<Vector2Int> positionsVisted = new List<Vector2Int>();
private static readonly Dictionary<Direction, Vector2Int> directionMovementMap = new Dictionary<Direction, Vector2Int>
{
{Direction.up, Vector2Int.up},
{Direction.left, Vector2Int.left},
{Direction.down, Vector2Int.down},
{Direction.right, Vector2Int.right}
};
public static List<Vector2Int> GenerateDungeon(genData dungeonData)
{
List<dungeonCrawler> dungeonCrawlers = new List<dungeonCrawler>();
for (int i = 0; i < dungeonData.numberOfCrawlers; i++)
{
dungeonCrawlers.Add(new dungeonCrawler(Vector2Int.zero));
}
int iterations = Random.Range(dungeonData.iterationMin, dungeonData.iterationMax);
for(int i = 0; i < iterations; i++)
{
foreach(dungeonCrawler dungeonCrawler in dungeonCrawlers)
{
Vector2Int newPos = dungeonCrawler.Move(directionMovementMap);
positionsVisted.Add(newPos);
}
}
return positionsVisted;
}
}
This is the Dungeon Crawler Controller.
public class generator : MonoBehaviour
{
public genData GenData;
private List<Vector2Int> dungeonRooms;
private void Start()
{
dungeonRooms = dungeonCrawlerController.GenerateDungeon(GenData);
SpawnRooms(dungeonRooms);
}
private void SpawnRooms(IEnumerable<Vector2Int> rooms)
{
roomController.instance.loadRoom("Start", 0, 0);
foreach (Vector2Int roomLocation in rooms)
{
roomController.instance.loadRoom("Empty", roomLocation.x, roomLocation.y);
}
}
}
This is the generator.
public class room : MonoBehaviour
{
public int width;
public int Height;
public int X;
public int Y;
void Start()
{
if (roomController.instance == null)
{
Debug.Log("U Ducked Up");
return;
}
roomController.instance.registerRoom(this);
}
void OnDrawGizmos()
{
Gizmos.color = Color.red;
Gizmos.DrawWireCube(transform.position, new Vector3(width, Height));
}
public Vector3 getRoomCenter()
{
return new Vector3 (X * width, Y * Height);
}
}
I think I need to add something here. This is the room script.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class roomInfo
{
public string name;
public int X;
public int Y;
}
public class roomController : MonoBehaviour
{
public static roomController instance;
string currentWorldName = "Basement";
roomInfo currentloadRoomData;
Queue<roomInfo> loadRoomQueue = new Queue<roomInfo>();
public List<room> loadedRooms = new List<room>();
bool isLoadingRoom = false;
void Awake()
{
instance = this;
}
void Update()
{
UpdateRoomQueue();
}
void UpdateRoomQueue()
{
if (isLoadingRoom)
{
return;
}
if (loadRoomQueue.Count == 0)
{
return;
}
currentloadRoomData = loadRoomQueue.Dequeue();
isLoadingRoom = true;
StartCoroutine(loadRoomRoutine(currentloadRoomData));
}
public void loadRoom( string name, int x, int y)
{
if (doesRoomExist(x, y))
{
return;
}
roomInfo newRoomData = new roomInfo();
newRoomData.name = name;
newRoomData.X = x;
newRoomData.Y = y;
loadRoomQueue.Enqueue(newRoomData);
}
IEnumerator loadRoomRoutine(roomInfo info)
{
string roomName = currentWorldName + info.name;
AsyncOperation loadRoom = SceneManager.LoadSceneAsync(roomName, LoadSceneMode.Additive);
while(loadRoom.isDone == false)
{
yield return null;
}
}
public void registerRoom( room room)
{
room.transform.position = new Vector3 (
currentloadRoomData.X * room.width,
currentloadRoomData.Y * room.Height,
0
);
room.X = currentloadRoomData.X;
room.Y = currentloadRoomData.Y;
room.name = currentWorldName + "-" + currentloadRoomData.name + " " + room.X + ", " + room.Y;
room.transform.parent = transform;
isLoadingRoom = false;
loadedRooms.Add(room);
}
public bool doesRoomExist ( int x, int y)
{
return loadedRooms.Find( item => item.X == x && item.Y == y) != null;
}
}
This is the Room Controller.
public class dungeonCrawler : MonoBehaviour
{
public Vector2Int Position { get; set;}
public dungeonCrawler(Vector2Int startPos)
{
Position = startPos;
}
public Vector2Int Move(Dictionary<Direction, Vector2Int> directionMovementMap)
{
Direction toMove = (Direction)Random.Range (0, directionMovementMap.Count);
Position += directionMovementMap[toMove];
return Position;
}
}
This is the last one.
hope u can help! @sath