Unity/Study

유니티 로그라이크 문으로 방 연결하기

홍삼맛 2023. 12. 18. 17:48

📌 연결된 문 생성

📄 Dungeon.cs

private void CreateDungeon()
{
    // 방 생성을 위한 좌표 리스트
    List<Vector2Int> alternativeRoomList = new();
    List<Vector2Int> hasBeenRemoveRoomList = new();
    // 특수 방 리스트
    List<Room> specialRoomList = new();

	...
    ...
    ...

    LinkDoors();
    
    // 방 문이 1개인 경우 => 특수 방으로 추가
    foreach (Room room in _roomArray)
    {
        if (room != null && room.ActiveDoorCount == 1 && room != currentRoom)
        {
            specialRoomList.Add(room);
        }
    }
}
  • GameScene 클래스를 Dungeon 클래스로 교체
  • specialRoomList는 특수 방을 모으기 위한 리스트
  • LinkDoors 메서드는 배치 된 방 마다 연결된 문을 생성해준다.
  • 특수 방 같은경우는, 시작 방을 제외한 해당 방에 문이 1개 밖에 없으면, 특수방 조건으로 맞춰준다.

📄 LinkDoors

/// <summary>
/// 방 기준으로 상하좌우 방이 존재 시, 문 생성
/// </summary>
private void LinkDoors()
{
    foreach (Room room in _roomArray)
    {
        if (room != null)
        {
            int x = room.Coordinate.x;
            int y = room.Coordinate.y;
            
            if (_roomArray[x + 1, y] != null)
            {
                room.ActivationDoor(RoomDirection.Up, _roomArray[x + 1, y], _roomArray[x + 1, y].DoorList[1]);
            }
            
            if (_roomArray[x - 1, y] != null)
            {
                room.ActivationDoor(RoomDirection.Down, _roomArray[x - 1, y], _roomArray[x - 1, y].DoorList[0]);
            }
            
            if (_roomArray[x, y - 1] != null)
            {
                room.ActivationDoor(RoomDirection.Left, _roomArray[x, y - 1], _roomArray[x, y - 1].DoorList[3]);
            }
            
            if (_roomArray[x, y + 1] != null)
            {
                room.ActivationDoor(RoomDirection.Right, _roomArray[x, y + 1], _roomArray[x, y + 1].DoorList[2]);
            }
        }
    }
}
  • 배치된 방을 다 가져와 상하좌우에 근접한 방이 있으면 문을 생성한다.

📄 Room.cs

public void ActivationDoor(RoomDirection direction, Room neighborRoom, GameObject neighborDoor)
{
    var door = doorList[(int)direction];
    
    for (int i = 0; i < door.transform.childCount; i++)
    {
        door.transform.GetChild(i).gameObject.SetActive(true);
    }
    
    activeDoorList.Add(door);
    neighborDoorList.Add(neighborDoor);
    neighborRoomList.Add(neighborRoom);    
}
  • doorList 배열에서 주어진 방향(RoomDirection)에 해당하는 문을 가져온다.
  • 활성화된 문은 for문으로 그 문의 자식오브젝트를 활성화하여, 문의 이미지를 가져온다.
  • activeDoorList, neighborDoorList, neighborRoomList 활성화된 문과 그 이웃한 문, 이웃한 방을 리스트에 추가하여 나중에 방과 문 간의 상호 작용 및 추적에 사용할 예정이다.

💡 결과 구현

문 연결 생성
전체적인 방끼리의 문 연결