public override IEnumerator Process() { if (config.LevelGraph == null) { throw new ArgumentException("LevelGraph must not be null."); } if (config.LevelGraph.Rooms.Count == 0) { throw new ArgumentException("LevelGraph must contain at least one room."); } var levelDescription = new LevelDescription(); // Setup individual rooms foreach (var room in config.LevelGraph.Rooms) { levelDescription.AddRoom(room, GetRoomTemplates(room)); } var typeOfRooms = config.LevelGraph.Rooms.First().GetType(); // Add passages foreach (var connection in config.LevelGraph.Connections) { if (config.UseCorridors) { var corridorRoom = (RoomBase)ScriptableObject.CreateInstance(typeOfRooms); if (corridorRoom is Room basicRoom) { basicRoom.Name = "Corridor"; } levelDescription.AddCorridorConnection(connection, corridorRoom, GetRoomTemplates(config.LevelGraph.CorridorRoomTemplateSets, config.LevelGraph.CorridorIndividualRoomTemplates)); } else { levelDescription.AddConnection(connection); } } Payload.LevelDescription = levelDescription; yield return(null); }
public virtual void Run(GeneratedLevel level, LevelDescription levelDescription) { }
public static GeneratedLevel TransformLayout(LayoutGrid2D <RoomBase> layout, LevelDescription levelDescription, GameObject rootGameObject) { // var layoutCenter = GetLayoutCenter(layout); var prefabToRoomTemplateMapping = levelDescription.GetPrefabToRoomTemplateMapping(); var corridorToConnectionMapping = levelDescription.GetCorridorToConnectionMapping(); // Prepare an object to hold instantiated room templates var roomTemplateInstancesRoot = new GameObject(GeneratorConstants.RoomsRootName); roomTemplateInstancesRoot.transform.parent = rootGameObject.transform; // Initialize rooms var layoutData = new Dictionary <RoomBase, RoomInstance>(); var layoutRooms = layout.Rooms.ToDictionary(x => x.Room, x => x); foreach (var layoutRoom in layoutRooms.Values) { var roomTemplatePrefab = prefabToRoomTemplateMapping.GetByValue(layoutRoom.RoomTemplate); // Instantiate room template var roomTemplateInstance = Object.Instantiate(roomTemplatePrefab); roomTemplateInstance.transform.SetParent(roomTemplateInstancesRoot.transform); roomTemplateInstance.name = $"{layoutRoom.Room.GetDisplayName()} - {roomTemplatePrefab.name}"; // Compute correct room position var position = layoutRoom.Position.ToUnityIntVector3(); roomTemplateInstance.transform.position = position; // Correct the position based on the grid // This is important when there is some cell spacing or when the level is isometric var tilemapsHolder = roomTemplateInstance.transform.Find(GeneratorConstants.TilemapsRootName).gameObject; if (tilemapsHolder != null) { var grid = tilemapsHolder.GetComponent <Grid>(); roomTemplateInstance.transform.position = grid.CellToLocal(position); } // Compute outline polygon var polygon = new Polygon2D(layoutRoom.Outline + layoutRoom.Position); var connection = layoutRoom.IsCorridor ? corridorToConnectionMapping[layoutRoom.Room] : null; var roomInstance = new RoomInstance(layoutRoom.Room, layoutRoom.IsCorridor, connection, roomTemplatePrefab, roomTemplateInstance, position, polygon); // Add room info to the GameObject var roomInfo = roomTemplateInstance.GetComponent <RoomInfo>(); if (roomInfo != null) { PostProcessUtils.Destroy(roomInfo); } roomInfo = roomTemplateInstance.AddComponent <RoomInfo>(); roomInfo.RoomInstance = roomInstance; layoutData.Add(layoutRoom.Room, roomInstance); } foreach (var roomInstance in layoutData.Values) { roomInstance.SetDoors(TransformDoorInfo(layoutRooms[roomInstance.Room].Doors, layoutData)); } // Add level info var levelInfo = rootGameObject.GetComponent <LevelInfo>(); if (levelInfo != null) { PostProcessUtils.Destroy(levelInfo); } levelInfo = rootGameObject.AddComponent <LevelInfo>(); levelInfo.RoomInstances = layoutData.Values.ToList(); return(new GeneratedLevel(layoutData, layout, rootGameObject)); }