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);
    }