언리얼의 assert

김영웅·2025년 4월 1일

assert는 C에서 생겨 개발 중 예상치 못한 런타임 조건을 탐지하고 진단하는 데 유용하다.
예를 들어, 포인터가 null이 아닌지, 제수가 0이 아닌지, 함수가 반복적으로 실행되지 않는지 등을 확인하여 중요한 가정이 맞는지 점검한다.

언리얼 엔진에서는 assert와 유사한 3가지 방법을 제공한다.

  • check : 절대 일어나면 안 되는 매우 기본적인 조건
  • verify : 대체 가능한 리소스나 상태 검사
  • ensure : 복잡한 조건과 자동 복구가 필요한 경우

이들은 모두 개발 중에 조건을 확인하고, 조건이 맞지 않으면 오류를 발생시키는 역할을 한다.
이 셋은 모두 기본적으론 Release Packege에선 작동을 안함.


check

check는 표현식이 false로 평가되면 실행을 멈춘다.

check 매크로는 디버그, 개발, 테스트, 릴리즈 에디터 빌드에서 작동하며, slow로 끝나는 매크로는 디버그 빌드에서만 작동한다.
USE_CHECKS_IN_SHIPPINGtrue로 설정하면 모든 빌드에서 작동한다.
check는 코드 내에서 값 변경이나 추적이 어려운 릴리즈 전용 버그를 확인할 때 유용하다.


ensure

ensure의 표현식이 false로 평가되면 크래시 리포터에 알리지만 실행은 계속된다.

ensure 계열은 verify와 비슷하지만, 치명적이지 않은 오류를 처리하는 데 사용된다.
크래시 리포터 플러드를 방지하기 위해 한 세션당 한 번만 보고된다.
ensure는 모든 빌드에서 표현식을 평가하지만, 디버그, 개발, 테스트, 릴리즈 에디터 빌드에서만 크래시 리포터에 알린다.
always 버전을 사용하면 매번 리포트를 받을 수 있다.

기본적으론 1회용 로그만 남기는 check라 보면 될 듯
ensureAlways를 쓰면 오류가 터질 때 마다 로그를 남겨줄 수 있음


verify

verify는 항상 표현식을 평가한다. 표현식이 항상 실행되어야 할 경우에 사용해야한다.

verifycheck와 비슷하지만, check가 비활성화된 빌드에서도 표현식을 평가한다.
verify는 디버그, 개발, 테스트, 릴리즈 에디터 빌드에서 작동하며, slow 매크로는 디버그 빌드에서만 작동한다.
USE_CHECKS_IN_SHIPPINGtrue로 설정하면 모든 빌드에서 작동한다.
verify는 표현식을 평가하지만 실행을 멈추거나 로그를 출력하지 않는다.

많이 안쓴다.

항상 표현식을 평가한다는게 이해가 잘 안될 수 있는데 아래와 같은 상황에 쓰인다.

ex)

// 메시 값을 설정하고 그 값이 null이 아닐 것으로 예상합니다. 
// 그 후 메시가 null이면 프로그램을 정지합니다.
// 표현식에 추가 이펙트(메시 세팅)가 있으므로 Check 대신 Verify를 사용합니다.
verify((Mesh = GetRenderMesh()) != nullptr);

//이게 Shipping 빌드에서는 아래처럼 바뀐다.
Mesh = GetRenderMesh();

더 자세한건 아래의 언리얼 어서트 설명을 보는게 좋다.

https://dev.epicgames.com/documentation/ko-kr/unreal-engine/asserts-in-unreal-engine

profile
게임 프로그래머

0개의 댓글