
로그란 개발 중에 스크립트에서 발생하는 문제나 상황에 따른 피드백을 얻기 위해 사용하는 중요한 도구이다스크립트에서 발생하는 문제나 상황을 개발자가 보기 쉽게 출력해 주는 것을 '로그(Log)'라고 한다
먼저 언리얼 엔진에서 로그가 출력되는 출력 로그 패널을 여는 방법부터 알아보자 [빈 템플릿, C++ 프로젝트로 생성한다]
언리얼 에디터의 상단 메뉴바에서 [Window > Output Log] 항목을 선택하거나,
ContentDrawser 옆에 Output Log를 클릭하면 로그 창을 열 수 있다(이 방법은 오른쪽에 Dock in Layout 버튼을 눌러야 고정이 된다)
그러면 출력 로그 패널이 열리는 것을 볼 수 있다
스크립트에서 우리가 출력하도록 명령한 로그들은 이 출력 로그 탭에서 출력될 것이다
간단한 로그를 출력해보기 위해서 Actor C++ 클래스 하나를 생성하고 생성한 클래스의 소스 파일을 연다
그리고 BeginPlay 이벤트 함수에서 로그를 출력하는 코드를 작성해 보자
사실 이 로그를 출력하는 것은 UE5-7 C++ <C++클래스 생성/기본 이벤트>에서 했던 방법인데, 언리얼 엔진에서 로그를 출력하기 위해서는 UE_LOG라는 매크로를 사용해야 한다
이 매크로의 매개변수에 (로그 카테고리, 로그 상세 수준, 로그로 남길 메시지)를 넣어주면 된다
이렇게 간단한 로그 코드만 작성한 뒤 저장하고 언리얼 에디터로 돌아가서 컴파일해 준다
그리고 C++클래스를 레벨에 배치하고 게임을 플레이해보면
작성한 로그가 출력 로그 패널에 출력되는 것을 확인할 수 있다
그럼 이제 로그 매개변수 중 하나인 로그 상세 수준을 한번 알아보자
로그 상세 수준은 보통 출력되는 로그의 중요도를 의미하며 이것을 이용해서 중요한 로그만 보이게 하거나 세부적인 모든 로그까지 보이게 만드는 등의 설정이 가능하다
이 로그 상세 수준에는 총 7가지 수준이 존재한다(Fatal, Error, Warning, Display, Log, Verbose, VeryVerbose)
- Fatal: 단어 그대로 가장 치명적인 수준의 로그로 항상 콘솔 및 로그 파일에 출력되며 로그가 비활성화된 상태에서도 모든 작동을 중단시킨다. 그래서 Fatal로 지정된 로그가 출력되거나 컴파일 혹은 빌드할 때 실행되는 상황이라면 충돌 리포트를 띄우게된다. 하지만 이것은 의도된 충돌이기 때문에 로그 파일이나 충돌 호출 스택을 확인하면 된다
- Error: 콘솔 및 로그 파일에 출력되며, 빨간색으로 표시된다
- Warning: 역시 콘솔 및 로그 파일에 출력되며 이 로그는 노란색으로 표시된다
- Display: 콘솔 및 로그 파일에 출력된다
- Log: 로그 파일에는 출력되지만 게임 내의 콘솔에서는 출력되지 않지만, 그래도 언리얼 에디터의 출력 로그 패널에서는 계속 출력된다
- Verbose: 로그 파일에는 출력되지만 게임 내의 콘솔에서는 출력되지 않는다 (일반적으로 자세한 로깅 및 디버깅에 사용된다)
- VeryVerbose: Verbose와 마찬가지로 로그 파일에는 출력되지만 게임 내의 콘솔에서는 출력되지 않는다 (대량의 로그를 출력하는 상세한 로깅에 사용된다)
https://docs.unrealengine.com/5.3/ko/logging-in-unreal-engine/
언리얼 엔진에서의 로깅
언리얼 엔진에서의 로깅과 관련된 정보를 살펴봅니다.
docs.unrealengine.com
이렇게 총 7가지의 상세 수준 중에서 가장 자주 사용되는 Error, Warning, Display를 사용해 보자
소스파일의 BeginPlay( )함수에서 코드를 작성하여 플레이 버튼을 누르자 마자 실행될 수 있도록 하고, UE_LOG 매크로를 사용해서 Log, Error, Warning, Display 로그 메시지가 나오도록 한다
로그 코드를 모두 작성하고 나면 저장하고 에디터로 돌아가서 컴파일해준다
컴파일이 끝나고 게임을 플레이시켜 보면 세 가지 로그가 출력되는 것을 볼 수 있는데, 앞에서 이야기한 대로 Error 수준의 로그는 빨간색으로, Warning 수준의 로그는 노란색으로, Display 수준의 로그는 하얀색으로 표시되는 것을 볼 수 있다
그 다음에 로그 카테고리를 보면, UE_LOG 매크로의 로그 카테고리 매개변수는 출력된 로그가 어떤 시스템에서 발생한 로그인지 알려주는 역할을 한다
이렇게 간단하게 사용할 때는 이 로그 카테고리에 LogTemp를 넣어서 사용했는데 이것은 특정한 카테고리에 속하지 않고 임시로 띄우는 로그라는 의미이다
Log까지 적고 [Ctrl + Space] 단축키를 눌러서 자동 완성을 띄워보면 여러 가지 카테고리를 볼 수 있다
[언리얼 엔진에서는 90개 이상의 카테고리를 기본적으로 제공하고 있다]
그럼 마지막으로 로그를 출력할 때 메시지를 다루는 방법을 알아보자
로그를 작성할 때는 지금 예시로 작성된 코드처럼 로그의 내용이 완전히 고정되어 있는 경우보다 상황이나 데이터에 따라 내용이 유동적으로 바뀌는 경우가 많다
이번에는 고정된 문자열 방식이 아닌 문자열 포맷팅을 통해서 고정된 로그의 내용과 원하는 데이터를 함께 출력하는 방법으로, 여러 가지 변수 타입 중에서 문자열 형인 FString을 출력하는 방법을 알아보자
먼저 로그에 메시지로 출력될 FString 타입의 변수를 선언한 후에 로그 코드를 작성한다
여기서 C언어를 해봤던 사람은 익숙하겠지만, 로그 메시지도 문자열로 대체될 부분을 "%s"로 입력한 다음 TEXT 매크로 끝에 쉼표를 찍고 %s에 대체 될 FString 타입의 변수를 넣어주면 된다
[다만 TEXT 매크로의 %s 지정자에서는 TCHAR* 타입을 받는데 이것은 FString* 타입에 대응하기 때문에 *CharacterName을 넣어주면 된다]
참고로 이 별표가 붙는 것은 C++ 특유의 포인터를 의미하는 것이다
간단하게 이야기하자면 int*, float*처럼 변수의 타입 뒤에 별표가 붙는 것은 해당 타입 변수의 메모리 주소를 값으로 가지는 변수라는 뜻이고, 방금 전의 *CharacterName처럼 변수의 이름 앞에 별표를 붙이는 것은 지금 이 변수의 값이 아닌 메모리 주소를 사용하겠다는 뜻으로 이해하면 된다. 그래서 인자를 그대로 받아들이지 못하는 UE_LOG는 포인터를 사용해서 값을 알려주어야 한다
하지만 항상 FStirng을 사용할 때 TEXT(" ")안에 있는 고정된 문장만 출력하는 것은 로그에 있어서 그렇게 유용한 편은 아니다.
그렇기 때문에 한번 동적값으로 로그를 출력해보자
예시로 이렇게 GetName()함수를 호출하여 ActorName 변수에 넣어주었다. 이렇게 하면 GetName( )함수는 액터의 이름을 받아서 ActorName 변수에 직접 입력할 수 있게 된다
저장하고 MyActor를 두개 배치한 뒤, 컴파일을 눌러 한번 확인해 보면
FString으로 선언된 CharacterName과 ActorName의 로그가 나오는데, 2개의 ActorName가 서로 이름이 다른 것을 볼 수 있다
[로그 패널에 로그가 2번 나오는 이유는 씬에 있는 모든 액터(MyActyor, MyActor2)에 대해서 로그를 출력하기 때문이다]
문자열은 이렇게 출력하면 되고 그다음은 논리변수인 bool 형이다
bool 타입은 따로 지정자가 없기 때문에 이렇게 %s와 삼항 연산자를 이용해서 직접 문자열을 넣어주어야 한다
[간단하게 isAttackable이 true일 경우 TEXT("true")가 할당되고, false일 경우 TEXT("false")가 할당된다]
그다음 int 타입은 %d 지정자를 사용하고, float형은 %f 지정자를 사용하면 된다
위치를 표현하는 데 사용하는 FVector 타입은 %s를 사용하되, FVector 클래스가 가진 ToString 함수를 사용하면 된다
이 ToString 함수는 해당 클래스 오브젝트가 가지고 있는 내용을 문자열로 만들어주는 역할을 한다
[참고로 GetActorLocation( ) 함수는 해당 액터의 위치를 가져오는 함수이다]
이제 마지막으로 여러 자료형의 데이터를 한꺼번에 로그로 출력해 보자
여러 자료형을 한꺼번에 한 로그로 출력하는 방법은 생각보다 쉽다
TEXT 매크로 안의 문자열에 지정자들을 넣어주고, TEXT 매크로 뒤에 지정자의 위치에 맞게 각 변수들을 나열하기만 하면 된다
이제 포맷을 사용해서 변수의 값에 따라서 달라지는 로그를 출력하는 방법을 대강 살펴봤으니 실제로 확인해 보자
코드를 모두 저장하고 에디터로 돌아가서 컴파일을 한 후에 게임을 플레이시키면
출력 로그 패널에 로그가 데이터 값과 함께 출력되는 것을 볼 수 있다
VR게임 개발을 위한 언리얼엔진/C++ 공부한 내용 끄적이기...
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!