본문 바로가기
TIL

방 생성 및 문 이동 시스템 구현

by vvin39 2025. 5. 9.

🎯 오늘의 목표

던전형 구조에서 방(Room)을 자동 생성하고, 문(Door)을 통해 플레이어가 자연스럽게 이동할 수 있도록 방 간 연결 시스템을 구축하는 것이 목표였다. 단방향이 아닌 양방향 문 연결플레이어 충돌 처리 이슈 해결에 초점을 맞췄다.

 

📌 주요 구현 내용 및 코드 중심 설명

RoomGenerator 스크립트 기반 방 생성 로직 작성

1. 랜덤한 방 생성 및 문 연결

  • 시작 방은 (0,0)을 기준으로 생성하며, 이후 maxRooms 수 만큼 상하좌우 방향으로 확장되도록 설계.
  • 방의 위치는 Dictionary<Vector2Int, Room>으로 관리되며, 중복 위치 생성을 방지함.
Vector2Int newPos;
do {
    Vector2Int dir = directions[Random.Range(0, directions.Length)];
    newPos = currentPos + dir;
} while (rooms.ContainsKey(newPos));
  • Room.Init()에서는 타일맵의 바운드 정보를 활용해 방의 실제 월드 위치 및 각 방향의 문 좌표를 계산함.
entryPositions[Vector2Int.left] = new Vector3(transform.position.x + bounds.min.x + 1f, center.y, 0f);

 

2. 방 연결 시 문 자동 생성 (GenerateDoorsForAllRooms)

  • 각 방에 대해 인접한 위치에 다른 방이 있을 경우, 문을 생성하도록 처리.
  • 이 방식은 일방향이 아닌 양방향 연결이 자연스럽게 생성되도록 한다.
if (rooms.ContainsKey(neighborPos))
{
    CreateDoorAt(room, dir);
}
  • 문 생성 시 방향에 따라 문 오브젝트의 Scale 값을 조절해 시각적으로 정렬되도록 함.
if (direction == Vector2Int.up)
{
    door.transform.localScale = new Vector3(1, 0.5f, 1);
}

 

  • 문에는 EntryTrigger가 부착되어 있으며, 진입 방향 정보(direction)가 함께 저장됨.

 

RoomNavigator

1. 플레이어의 진입 방향을 기준으로 위치 계산 및 이동

  • 플레이어는 문에 진입하면 GetEntryPositionFrom(fromDirection)을 통해 다음 방의 입구로 이동.
  • entry + offset 방식으로 문 근처에 자연스럽게 배치되며, 겹침 방지를 위해 이동 시 약간의 오프셋 적용.
Vector3 offset = ((Vector2)fromDirection).normalized * 1.0f;
Vector3 targetPos = entry + offset;

2. 이동 시 충돌 처리 임시 비활성화로 트리거 반복 방지

  • 이동 직후 문과 다시 충돌하는 루프를 방지하기 위해 플레이어의 Collider2D를 0.2초간 비활성화.
playerCollider.enabled = false;
player.transform.position = targetPosition;
yield return new WaitForSeconds(0.2f);
playerCollider.enabled = true;
 
  • 이 방식은 플레이어가 문 입구에 정확히 배치되어도 이동 처리가 중복 발생하지 않도록 함.

 

📌 오늘 겪은 주요 트러블과 해결 과정

플레이어가 이동 중 문과 계속 충돌

  • 문을 통해 이동한 직후, 플레이어가 문 충돌 판정에 걸려 반복 이동 루프 발생.
  • 해결: isTransitioning 플래그 + Coroutine을 이용해 충돌 감지를 일시 비활성화.

 

💡 오늘 느낀 점

방 생성 로직은 단순히 오브젝트를 배치하는 수준이 아니라, 게임 월드의 구조적 연결성과 플레이어 경험을 함께 고려해야 한다는 것을 느꼈다. 특히 문이 잘못 연결되면 플레이어가 진행을 못하거나, 이동 중 끊김 없는 흐름을 유지하기 어려워진다는 점에서 세심한 위치 계산과 충돌 처리 타이밍이 매우 중요했다.

 

✅ 내일 목표

  • 문마다 플레이어를 어느 위치로 이동시킬지 Offset 기준을 명확하게 데이터화
  • 미니맵 시스템의 기본 뼈대 구성
  • 방마다 고유 ID 또는 이름 부여 및 디버깅용 UI 출력

최근댓글

최근글

skin by © 2024 ttuttak