Auto-QA Bot으로 던전 맵 뚫림과 경로 탐색을 자동 테스트하는 방법

Unity 기반 Auto-QA Bot이 던전 맵의 콜라이더 뚫림, 도달 불가 구역, 비정상 지름길을 반복 탐색으로 찾아내는 구조를 설명한다. NavMesh와 물리 이동 결과를 비교해 재현 가능한 버그 리포트까지 만드는 실전 절차를 다룬다.

✓ 복사 완료!
챕터자동화 테스트 & 회귀 검증
난이도중급
상태● 검토 완료
대상 엔진
Engine Agnostic
최종 업데이트
Auto-QA Bot으로 던전 맵 뚫림과 경로 탐색을 자동 테스트하는 방법

핵심 요약

Auto-QA Bot은 던전의 시작점과 목표점을 대량 생성한 뒤 NavMesh.CalculatePath의 예상 경로와 실제 캐릭터 이동 결과를 비교해 맵 뚫림·도달 불가·비정상 지름길을 찾는 자동 테스트 방식이다. Unity 2022.3 LTS, C# 기준으로 NavMesh 판정과 물리 충돌 검증을 분리하면 레벨 변경 뒤에도 같은 시나리오를 반복 실행하고 실패 좌표와 재현 시드까지 남길 수 있다.

던전 맵 뚫림 버그는 왜 반복 테스트가 필요한가?

수동 플레이는 사람이 지나가는 대표 동선에 집중한다. 반면 맵 뚫림은 벽 모서리, 경사면 접합부, 문이 닫히는 프레임, 좁은 장애물 틈처럼 낮은 확률로만 밟히는 위치에 숨어 있다. 절차 생성 던전이라면 방 조합마다 다시 확인해야 한다.

경로 탐색 테스트는 다음 두 질문을 분리해야 한다.

검증 대상확인 방법대표 실패
내비게이션 데이터NavMesh.CalculatePath연결되지 않은 방, 베이크 누락
실제 이동 가능성CharacterController.Move 또는 Rigidbody 이동콜라이더 틈 통과, 문 충돌체 불일치
게임 규칙잠긴 문, 점프 제한, 일방통행NavMesh는 경로를 반환하지만 플레이어는 이동 불가

Auto-QA Bot이 던전의 시작점과 목표점 사이를 탐색하며 실패 좌표를 기록하는 화면

Auto-QA Bot은 어떻게 구현할까?

1. 재현 가능한 테스트 입력을 만든다

난수 시드를 고정하고 스폰 가능한 NavMesh 좌표에서 시작점과 목표점을 뽑는다. 실패한 시드가 로그에 남아야 같은 던전과 같은 목적지를 다시 만들 수 있다.

using UnityEngine;
using UnityEngine.AI;

public static class DungeonPointSampler
{
    public static bool TrySample(Vector3 near, out Vector3 point)
    {
        return NavMesh.SamplePosition(near, out var hit, 4f, NavMesh.AllAreas)
            ? Set(hit.position, out point)
            : Set(Vector3.zero, out point, false);
    }

    static bool Set(Vector3 value, out Vector3 point, bool result = true)
    {
        point = value;
        return result;
    }
}

이 함수는 난수를 생성하지 않고, 호출자가 시드 기반으로 고른 후보점 near를 NavMesh 위의 점으로 보정한다. 시작점과 목표점의 재현 가능한 선택은 호출부에서 같은 난수 시드와 후보 순서를 사용해 처리해야 한다.

실제 프로젝트에서는 방 중심, 출입구, 전투 구역 가장자리처럼 의미 있는 후보군을 먼저 사용한다. 완전한 무작위 좌표보다 실패 원인을 읽기 쉽고 테스트 시간도 줄어든다.

2. NavMesh 경로와 실제 이동을 각각 검증한다

NavMeshPathStatus.PathComplete는 경로 데이터가 목표까지 이어진다는 뜻일 뿐, 실제 캐릭터가 모든 코너를 통과한다는 보장은 아니다. 각 코너까지 이동하며 벽 충돌과 진행 거리를 확인한다.

using UnityEngine;
using UnityEngine.AI;

public static class PathProbe
{
    public static bool HasCompletePath(Vector3 start, Vector3 goal, out NavMeshPath path)
    {
        path = new NavMeshPath();
        return NavMesh.CalculatePath(start, goal, NavMesh.AllAreas, path)
            && path.status == NavMeshPathStatus.PathComplete;
    }

    public static bool CrossesWall(Vector3 from, Vector3 to, float radius, LayerMask wallMask)
    {
        var distance = Vector3.Distance(from, to);
        return Physics.SphereCast(from, radius, (to - from).normalized, out _, distance, wallMask);
    }
}

봇이 코너를 따라 이동했는데 벽 레이어를 통과하거나 일정 시간 동안 목표 거리 감소가 없으면 실패로 기록한다. 이동 성공률은 다음처럼 계산할 수 있다.

successRate=completedRunstotalRuns×100successRate = \frac{completedRuns}{totalRuns} \times 100

3. 실패를 버그 리포트로 바로 남긴다

성공·실패만 집계하면 QA가 다시 현장을 찾아야 한다. 최소한 던전 시드, 시작·목표 좌표, 경로 코너, 실패 유형, 스크린샷을 한 레코드로 저장한다.

seed=18473
start=(12.4, 0.0, -8.1)
goal=(36.8, 0.0, 14.6)
result=WallPenetration
cornerIndex=3
build=1.8.0-rc2

WallPenetration, PathIncomplete, Stuck, RuleMismatch처럼 실패 코드를 제한하면 빌드별 추세를 비교하기 쉽다.

flowchart LR
    A[던전 시드 생성] --> B[시작점·목표점 선택]
    B --> C[NavMesh 경로 계산]
    C -->|실패| R[실패 로그 저장]
    C -->|성공| D[실제 이동 시뮬레이션]
    D -->|충돌·정지·이탈| R
    D -->|목표 도달| S[성공 집계]

맵 뚫림 판정의 기준은 무엇인가?

단순히 목표에 도착했다고 성공 처리하면 벽을 통과한 봇이 정상으로 보일 수 있다. 따라서 이동 구간마다 캐릭터 반지름과 같은 크기의 SphereCast를 수행하고 벽 레이어 충돌 여부를 검사한다.

다만 문이나 파괴 가능한 장애물처럼 상태가 변하는 오브젝트는 별도 규칙이 필요하다. 닫힌 문을 통과한 경우는 맵 뚫림, 열린 뒤 통과한 경우는 정상으로 구분해야 한다. 이때 테스트 시작 전 오브젝트 상태를 고정하거나 상태 전이를 로그에 함께 남긴다.

실패한 경로의 코너와 벽 콜라이더 접점을 표시한 디버그 시각화

CI에서 Auto-QA Bot을 어떻게 돌릴까?

  1. 매 레벨 변경 또는 NavMesh 재베이크가 포함된 빌드에서 테스트 씬을 실행한다.
  2. 고정 시드 세트와 최근 실패 시드를 우선 실행한다.
  3. 실패가 1건이라도 나오면 로그와 스크린샷을 아티팩트로 보관하고 빌드를 경고 또는 실패 처리한다.

처음부터 수만 경로를 모든 커밋에 돌릴 필요는 없다. PR에서는 대표 시드 100개, 야간 빌드에서는 더 넓은 시드 범위와 장시간 이동 검증을 실행하는 구성이 비용 대비 효율적이다.

자주 묻는 질문 (FAQ)

아니다. NavMesh는 이동 가능 영역 데이터이며 런타임 콜라이더와 캐릭터 컨트롤러 설정이 다르면 실제 이동에서 벽 통과 또는 끼임이 발생할 수 있다.

모든 좌표를 전수 검사해야 하는가?

아니다. 방 중심·출입구·벽 모서리·문 주변을 우선 샘플링하고 절차 생성 시드와 과거 실패 좌표를 누적하는 방식이 더 실용적이다.

실패 재현율을 높이려면 무엇을 저장해야 하는가?

던전 생성 시드, 빌드 버전, 시작·목표 좌표, 오브젝트 상태, 실패 시점의 경로 코너와 봇 이동 파라미터를 저장해야 한다.

정리

던전 자동 테스트의 핵심은 경로가 계산됐는지와 캐릭터가 규칙을 지키며 실제로 이동했는지를 분리하는 것이다. 고정 시드와 좌표 중심의 실패 로그만 갖춰도 Auto-QA Bot은 레벨 수정 이후의 회귀 버그를 빠르게 잡아내는 반복 가능한 QA 도구가 된다.