public RoomInstance(RoomBase room, bool isCorridor, ConnectionBase connection, GameObject roomTemplatePrefab, GameObject roomTemplateInstance, Vector3Int position, Polygon2D outlinePolygon) { this.room = room; this.connection = connection; this.roomTemplatePrefab = roomTemplatePrefab; this.roomTemplateInstance = roomTemplateInstance; this.position = position; this.outlinePolygon = outlinePolygon; this.isCorridor = isCorridor; }
public RoomInstanceGrid2D(RoomBase room, bool isCorridor, ConnectionBase connection, GameObject roomTemplatePrefab, GameObject roomTemplateInstance, Vector3Int position, Polygon2D outlinePolygon) : base(room, isCorridor, connection, roomTemplatePrefab, roomTemplateInstance, position, outlinePolygon) { }
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)); }