Beispiel #1
0
        protected Layout <TRoom> TransformLayout(IMapLayout <TRoom> layout, TwoWayDictionary <IRoomDescription, GameObject> roomDescriptionsToRoomTemplates)
        {
            var roomTransformations = new RoomTransformations();

            // Prepare an object to hold instantiated room templates
            var parentGameObject = new GameObject("Room template instances");

            parentGameObject.transform.parent = Payload.GameObject.transform;

            // Initialize rooms
            var layoutData = new Dictionary <TRoom, RoomInfo <TRoom> >();

            foreach (var layoutRoom in layout.Rooms)
            {
                var roomTemplate = roomDescriptionsToRoomTemplates[layoutRoom.RoomDescription];

                // Instatiate room template
                var room = Object.Instantiate(roomTemplate);
                room.SetActive(false);
                room.transform.SetParent(parentGameObject.transform);

                // Transform room template if needed
                var transformation = layoutRoom.Transformation;
                roomTransformations.Transform(room, transformation);

                // Compute correct room position
                // We cannot directly use layoutRoom.Position because the dungeon moves
                // all room shapes in a way that they are in the first plane quadrant
                // and touch the xy axes. So we have to subtract the original lowest
                // x and y coordinates.
                var smallestX       = layoutRoom.RoomDescription.Shape.GetPoints().Min(x => x.X);
                var smallestY       = layoutRoom.RoomDescription.Shape.GetPoints().Min(x => x.Y);
                var correctPosition = layoutRoom.Position.ToUnityIntVector3() - new Vector3Int(smallestX, smallestY, 0);
                room.transform.position = correctPosition;

                var roomInfo = new RoomInfo <TRoom>(roomTemplate, room, correctPosition, TransformDoorInfo(layoutRoom.Doors),
                                                    layoutRoom.IsCorridor, layoutRoom);

                room.transform.position = new Vector3(room.transform.position.x * 32, room.transform.position.y * 16, 0);
                //room.gameObject.SetActive(true);

                foreach (Transform child in room.transform)
                {
                    if (child.gameObject.tag == "object")
                    {
                        var pos = child.transform.localPosition;
                        child.transform.SetParent(room.transform.parent);
                        child.transform.localScale = new Vector3(1, 1, 0);
                        child.transform.position   = new Vector3(room.transform.position.x + pos.x, room.transform.position.y + pos.y, 0);
                    }
                }

                room.transform.localScale = new Vector3(1, 1, 0);

                layoutData.Add(layoutRoom.Node, roomInfo);
            }

            return(new Layout <TRoom>(layoutData));
        }
        protected void SetupRoomTemplates(IMapLayout <int> layout)
        {
            var roomTransformations = new RoomTransformations();

            // Prepare an object to hold instantiated room templates
            var parentGameObject = new GameObject("Room template instances");

            parentGameObject.transform.parent = Payload.GameObject.transform;

            // Initialize rooms
            Payload.LayoutData = new Dictionary <int, RoomInfo <int> >();
            foreach (var layoutRoom in layout.Rooms)
            {
                var roomTemplate = Payload.RoomDescriptionsToRoomTemplates[layoutRoom.RoomDescription];

                // Instatiate room template
                var room = Object.Instantiate(roomTemplate);
                room.SetActive(false);
                room.transform.SetParent(parentGameObject.transform);

                // Transform room template if needed
                var transformation = layoutRoom.Transformation;
                roomTransformations.Transform(room, transformation);

                // Compute correct room position
                // We cannot directly use layoutRoom.Position because the dungeon moves
                // all room shapes in a way that they are in the first plane quadrant
                // and touch the xy axes. So we have to subtract the original lowest
                // x and y coordinates.
                var smallestX       = layoutRoom.RoomDescription.Shape.GetPoints().Min(x => x.X);
                var smallestY       = layoutRoom.RoomDescription.Shape.GetPoints().Min(x => x.Y);
                var correctPosition = layoutRoom.Position.ToUnityIntVector3() - new Vector3Int(smallestX, smallestY, 0);
                room.transform.position = correctPosition;

                var roomInfo = new RoomInfo <int>(roomTemplate, room, correctPosition, TransformDoorInfo(layoutRoom.Doors),
                                                  layoutRoom.IsCorridor, layoutRoom);

                Payload.LayoutData.Add(layoutRoom.Node, roomInfo);
            }
        }
        public static GeneratedLevel TransformLayout(IMapLayout <Room> layout, LevelDescription levelDescription, GameObject rootGameObject)
        {
            // var layoutCenter = GetLayoutCenter(layout);
            var prefabToRoomTemplateMapping = levelDescription.GetPrefabToRoomTemplateMapping();
            var corridorToConnectionMapping = levelDescription.GetCorridorToConnectionMapping();

            var roomTransformations = new RoomTransformations();

            // Prepare an object to hold instantiated room templates
            var roomTemplateInstancesRoot = new GameObject("Room template instances");

            roomTemplateInstancesRoot.transform.parent = rootGameObject.transform;

            // Initialize rooms
            var layoutData  = new Dictionary <Room, RoomInstance>();
            var layoutRooms = layout.Rooms.ToDictionary(x => x.Node, 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);

                // Transform room template if needed
                var transformation = layoutRoom.Transformation;
                roomTransformations.Transform(roomTemplateInstance, transformation);

                // Compute correct room position
                var position = layoutRoom.Position.ToUnityIntVector3();
                roomTemplateInstance.transform.position = position;

                // Compute outline polygon
                var polygon = new Polygon2D(layoutRoom.Shape + layoutRoom.Position);

                var connection   = layoutRoom.IsCorridor ? corridorToConnectionMapping[layoutRoom.Node] : null;
                var roomInstance = new RoomInstance(layoutRoom.Node, 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.Node, 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));
        }