게임 개발/Unreal Engine 기본

unreal engine assertion들 check, ensure, verify 등등...

지노윈 2025. 12. 30. 11:38
반응형

1. check(조건)

가장 강력하고 엄격한 어설션입니다.

  • 동작: 조건이 거짓이면 게임을 즉시 중단(Crash)시키고 로그를 남깁니다.
  • 특징: Shipping 빌드(배포판)에서는 코드 자체가 삭제됩니다. 즉, 개발 단계에서만 동작하며 릴리즈된 게임의 성능에는 영향을 주지 않습니다.
  • 사용 예시: "이 포인터는 여기서 절대 null일 수 없다"고 확신할 때 사용합니다.
    check(MeshComponent != nullptr);
    MeshComponent->SetVisibility(true); // 만약 null이었다면 위에서 이미 멈췄을 것
    

2. ensure(조건)

조금 더 유연한 어설션입니다.

  • 동작: 조건이 거짓이면 콜스택(Call Stack)을 로그에 출력하지만, 게임은 멈추지 않고 계속 실행됩니다. (에디터에서는 한 번만 멈추고 디버거를 띄워줍니다.)
  • 특징: check와 마찬가지로 Shipping 빌드에서는 제거됩니다.
  • 사용 예시: "문제가 있긴 하지만, 당장 크래시를 낼 정도는 아닐 때" 또는 "문제를 인지만 하고 실행은 계속하고 싶을 때" 사용합니다. if문과 조합해서 자주 씁니다.
    if (ensure(WeaponActor != nullptr))
    {
        WeaponActor->Fire();
    }
    

3. verify(조건)

check와 거의 동일하지만, 한 가지 결정적인 차이가 있습니다.

  • 동작: 조건이 거짓이면 **즉시 중단(Crash)**됩니다.
  • 특징: Shipping 빌드에서도 코드가 삭제되지 않고 실행됩니다. 단, Shipping 빌드에서는 "조건 검사"는 수행하지만 "실패 시 크래시" 기능은 비활성화됩니다.
  • 사용 예시: 조건식 안에 실제 로직(함수 호출)이 포함되어 있을 때 사용합니다. check를 쓰면 릴리즈 시 함수 호출 자체가 사라져버리지만, verify는 함수를 실행해 줍니다.
    // Shipping 빌드에서도 OpenDoor()는 실행되어야 함
    verify(OpenDoor() == true); 
    

💡 한눈에 비교하기

매크로 실패 시 결과 Shipping 빌드 포함 여부 용도
check 즉시 중단 (Crash) 제거됨 치명적인 오류 확인 (개발용)
ensure 로그 출력 후 계속 실행 제거됨 경고 및 비치명적 오류 확인
verify 즉시 중단 (Crash) 표현식은 유지됨 반환값이 있는 로직 확인

4. 기타 유용한 변형들

  • checkNoEntry(): 절대 도달해서는 안 되는 코드 경로에 둡니다. (예: switch문의 default 케이스)
  • checkf(조건, L"메시지"): 실패했을 때 사용자 정의 메시지를 로그에 함께 출력합니다. (check, ensure, verify 모두 뒤에 f를 붙인 버전이 존재합니다.)
  • unimplemented(): 아직 구현되지 않은 함수임을 표시하며, 호출 시 크래시를 발생시킵니다.
반응형