public List <DungeonObject> GenerateDungeonData(WorldHandler worldHandler) { var modules = new List <DungeonObject>(); var numberOfRetries = 0; var numberOfRoomsCreated = 0; var currentRoom = CreateRoom(Vector3.zero); worldHandler.AddTemporaryCollider(currentRoom.Position, currentRoom.Bounds.size, Vector3.zero); modules.Add(currentRoom); numberOfRoomsCreated++; while (numberOfRoomsCreated < Values.MaximumNumberOfRoomsAllowed && numberOfRetries < Values.MaximumNumberOfRetries) { for (var i = 0; i < currentRoom.NumberOfExits; i++) { var currentExit = currentRoom.Corners.GetRandomElement(); // Check corridor collision var raycastDistance = 50; var currentExitDirection = (currentExit.Position - currentRoom.Position).normalized; var corridorWidth = Vector3.Distance(currentExit.LeftFloor, currentExit.RightFloor); var ray = new Ray(currentExit.Position, currentExitDirection + Values.RandomRoomHeightPosition); if (Physics.SphereCast(ray, corridorWidth * 0.5f, raycastDistance)) { numberOfRetries++; continue; } // Check room collision var newRoomPosition = ray.GetPoint(raycastDistance); if (Physics.CheckSphere(newRoomPosition, Values.RoomRadiusMax)) { continue; } // Create room var newRoom = CreateRoom(newRoomPosition); worldHandler.AddTemporaryCollider(newRoom.Position, newRoom.Bounds.size, Vector3.zero); modules.Add(newRoom); numberOfRoomsCreated++; // Set exits var newExit = FindNearestExit(newRoom.Corners, currentExit); currentRoom.Exit = currentExit; currentRoom.LinksTo = newExit; currentRoom.ExitCorners.Add(currentExit.CornerIndex); newRoom.ExitCorners.Add(newExit.CornerIndex); // Create corridor var corridor = CreateCorridor(currentExit, newExit); modules.Add(corridor); var colliderSize = new Vector3(corridorWidth, corridorWidth, Vector3.Distance(corridor.From.Position, corridor.To.Position)); worldHandler.AddTemporaryCollider(Vector3.Lerp(corridor.From.Position, corridor.To.Position, 0.5f), colliderSize, corridor.To.Position); currentRoom = newRoom; break; } } return(modules); }