示例#1
0
            private void ConnectDoorsAt(Vector2Int position)
            {
                RoomConnectionBehaviour room = _grid[position];
                HashSet <Direction>     requiredDirections = FindRequiredDirectionsFor(position);

                foreach (DoorConnectionBehaviour door in room.Doors)
                {
                    if (requiredDirections.Contains(door.Direction))
                    {
                        Vector2Int neighbouringPosition          = position + door.Direction.ToVector2Int();
                        RoomConnectionBehaviour neighbouringRoom = _grid[neighbouringPosition];
                        DoorConnectionBehaviour neighbouringDoor = neighbouringRoom.GetDoorFacing(door.Direction.Opposite());
                        DoorConnectionBehaviour.Connect(door, neighbouringDoor);
                    }
                }
            }
        public void OnTriggerStay2D(Collider2D other)
        {
            DoorConnectionBehaviour doorConnectionBehaviour = other.GetComponent <DoorConnectionBehaviour>();

            if (doorConnectionBehaviour != null && doorConnectionBehaviour.IsOpen)
            {
                Direction direction = doorConnectionBehaviour.Direction;

                float dotproduct = Vector2.Dot(direction.ToVector2(), _playerMovementBehaviour.Direction);
                float angle      = Extensions.MapBetween(dotproduct, -1.0f, 1.0f, 180, 0);
                if (angle < 50)
                {
                    GetComponent <PlayerMovementBehaviour>().Velocity = Vector2.zero;
                    _levelTraversalBehaviour.ChangeRoom(doorConnectionBehaviour);
                }
            }
        }
        private static void VerifyAllDoorsConnect()
        {
            // create room grid
            Dictionary <Vector2Int, RoomConnectionBehaviour> roomGrid = new Dictionary <Vector2Int, RoomConnectionBehaviour>();

            RoomConnectionBehaviour[] roomConnectionBehaviours = GameObject.FindObjectsOfType <RoomConnectionBehaviour>();
            foreach (RoomConnectionBehaviour roomConnectionBehaviour in roomConnectionBehaviours)
            {
                Vector2    position     = roomConnectionBehaviour.transform.localPosition;
                Vector2Int roomPosition = Vector2Int.RoundToInt(position / LevelGenerator.RoomPlacementOffset);
                if (roomGrid.ContainsKey(roomPosition))
                {
                    continue;
                }
                roomGrid.Add(roomPosition, roomConnectionBehaviour);
            }

            // ensure that all doors in the grid connect to eachother
            foreach (var pair in roomGrid)
            {
                Vector2Int roomPosition      = pair.Key;
                RoomConnectionBehaviour room = pair.Value;

                foreach (DoorConnectionBehaviour door in room.Doors)
                {
                    Vector2Int neighbouringPosition = roomPosition + door.Direction.ToVector2Int();

                    if (!roomGrid.ContainsKey(neighbouringPosition))
                    {
                        Error($"Detected door(s) that lead nowhere. Room {Log.Red(room.name)} located at {Log.Red(roomPosition * LevelGenerator.RoomPlacementOffset)} requires a {Log.Red(door.Direction)} neighbouring room.", room.transform.position);
                        return;
                    }

                    RoomConnectionBehaviour neighbouringRoom = roomGrid[neighbouringPosition];
                    DoorConnectionBehaviour neighbouringDoor = neighbouringRoom.GetDoorFacing(door.Direction.Opposite());

                    if (neighbouringDoor == null)
                    {
                        Error($"Detected door(s) that lead into a wall. Room {Log.Red(room.name)} located at {Log.Red(roomPosition * LevelGenerator.RoomPlacementOffset)} has a {Log.Red(door.Direction)} neighbouring room that does not contain a {Log.Red(door.Direction.Opposite())} door.", room.transform.position);
                        return;
                    }
                }
            }
        }
        private static void ConnectDoors(Dictionary <Vector2Int, RoomConnectionBehaviour> roomGrid)
        {
            foreach (var pair in roomGrid)
            {
                Vector2Int position          = pair.Key;
                RoomConnectionBehaviour room = pair.Value;

                foreach (DoorConnectionBehaviour door in room.Doors)
                {
                    Vector2Int neighbouringPosition = position + door.Direction.ToVector2Int();

                    // expected to error if neighbouring room does not exist
                    RoomConnectionBehaviour neighbouringRoom = roomGrid[neighbouringPosition];
                    DoorConnectionBehaviour neighbouringDoor = neighbouringRoom.GetDoorFacing(door.Direction.Opposite());

                    // expected to error if neighbouring door does not exist
                    DoorConnectionBehaviour.Connect(door, neighbouringDoor);
                }
            }
        }