카테고리 보관물: Unreal

Unreal 5.4 AdMob 연동 시 빌드 되지 않는 문제 해결

개요

Unreal 5.4 버전이 공개되고 해당 엔진으로 개발을 진행하고 있었습니다. 어느 정도 개발이 진행되고 광고를 포함하려고 AdMob 을 연동했습니다. 그러나 빌드를 하면 오류가 발생하면서 파일이 생성되지 않는 문제가 있었습니다.

오류

오류의 내용은 다음과 같습니다.

로그의 일부

UATHelper: Packaging (Android (ASTC)): Z:\app\src\main\java\com\epicgames\unreal\GameActivity.java:699: error: cannot find symbol
UATHelper: Packaging (Android (ASTC)): activityContext.runOnUiThread(new Runnable()
UATHelper: Packaging (Android (ASTC)): ^
UATHelper: Packaging (Android (ASTC)): symbol: method runOnUiThread()
UATHelper: Packaging (Android (ASTC)): location: variable activityContext of type ContextWrapper
UATHelper: Packaging (Android (ASTC)): Z:\app\src\main\java\com\epicgames\unreal\GameActivity.java:724: error: cannot find symbol
UATHelper: Packaging (Android (ASTC)): activityContext.runOnUiThread(new Runnable()
UATHelper: Packaging (Android (ASTC)): ^
UATHelper: Packaging (Android (ASTC)): symbol: method runOnUiThread()
UATHelper: Packaging (Android (ASTC)): location: variable activityContext of type ContextWrapper
UATHelper: Packaging (Android (ASTC)): Z:\app\src\main\java\com\epicgames\unreal\GameActivity.java:790: error: cannot find symbol
UATHelper: Packaging (Android (ASTC)): activityContext.runOnUiThread(new Runnable()
UATHelper: Packaging (Android (ASTC)): ^
UATHelper: Packaging (Android (ASTC)): symbol: method runOnUiThread()
UATHelper: Packaging (Android (ASTC)): location: variable activityContext of type ContextWrapper
UATHelper: Packaging (Android (ASTC)): Z:\app\src\main\java\com\epicgames\unreal\GameActivity.java:811: error: cannot find symbol
UATHelper: Packaging (Android (ASTC)): activityContext.runOnUiThread(new Runnable()
UATHelper: Packaging (Android (ASTC)): ^
UATHelper: Packaging (Android (ASTC)): symbol: method runOnUiThread()
UATHelper: Packaging (Android (ASTC)): location: variable activityContext of type ContextWrapper
UATHelper: Packaging (Android (ASTC)): Z:\app\src\main\java\com\epicgames\unreal\GameActivity.java:831: error: cannot find symbol
UATHelper: Packaging (Android (ASTC)): activityContext.runOnUiThread(new Runnable()
UATHelper: Packaging (Android (ASTC)): ^
UATHelper: Packaging (Android (ASTC)): symbol: method runOnUiThread()
UATHelper: Packaging (Android (ASTC)): location: variable activityContext of type ContextWrapper
UATHelper: Packaging (Android (ASTC)): Z:\app\src\main\java\com\epicgames\unreal\GameActivity.java:873: error: cannot find symbol
UATHelper: Packaging (Android (ASTC)): activityContext.runOnUiThread(new Runnable()
UATHelper: Packaging (Android (ASTC)): ^
UATHelper: Packaging (Android (ASTC)): symbol: method runOnUiThread()
UATHelper: Packaging (Android (ASTC)): location: variable activityContext of type ContextWrapper

YourProject.Target.cs 파일에 ExtraModuleNames.Add(“AndroidAdvertising”); 가 활성화 되어 있는 것이 원인이었습니다. 5.3 버전에서는 문제 없이 빌드 되고 광고가 나타났는데 5.4 버전에서는 그렇지 않았습니다.

오류 해결 시도

문제를 없애고자 다음과 같이 조치해 보았는데 해결되지 않았습니다.

  1. Android Target 변경 latest 에서 android-33 으로 변경해도 동일(원래 34)
  2. 프로젝트의 버전을 5.3 으로 변경해서 빌드하려고 했으나 소스코드내의 버전 번호가 일치하지 않고 Map(Level) 파일의 버전이 맞지 않는다는 메시지가 나타남. Map(Level) 파일이 나타나지 않음.

해결방법(아마도 임시)

근본적인 해결책인지 확신 할 수 없지만 필자가 개발 중인 프로젝트에서는 배너 광고가 제대로 나타나고 게임도 제대로 동작했습니다. 엔진 버전은 5.4.1 입니다.

  1. Android Studio 로 YourProject\Intermediate\Android\arm64\gradle\ 프로젝트를 엽니다. 경로는 개발 환경에 따라 다를 수 있습니다.
  2. YourProject\Intermediate\Android\arm64\gradle\app\src\main\java\com\epicgames\unreal\GameActivity.java 파일을 엽니다.
  3. 오류가 발생하는 activityContext.runOnUiThread 이 부분을 this.runOnUiThread 로 변경해서 Android Studio에서 빌드합니다.

이렇게 하면 광고가 정상적으로 나타나는 것을 확인할 수 있습니다. 같은 문제를 겪고 계신분들께 도움이 되었으면 합니다.

근본적인 해결책이 무엇인지는 알 수 없으나 엔진이 빨리 패치 되어 문제가 해결되었으면 좋겠습니다.

근본적인 해결책

빌드 할 때 마다 GameActivity.java 파일을 수정하는 것이 너무 불편해서 조금 더 파악해 보았습니다. 그 결과 위 오류 로그에 나타나는 내용이 포함되어 있는 파일을 찾아냈습니다.

C:\YourPath\Epic Games\UE_5.4\Engine\Source\Runtime\Advertising\Android\AndroidAdvertising\AndroidAdvertising_APL.xml 파일을 열어보면 오류가 발생한 내용과 같은 행이 있는 것을 알 수 있습니다.

Unreal 을 종료한 후 작업합니다. AndroidAdvertising_APL.xml 파일을 백업 하신 후 내용 중activityContext.runOnUiThread(new Runnable() 를 this.runOnUiThread(new Runnable() 로 변경하고 다시 시작한 후 Unreal에서 Package Project 를 수행하면 오류 없이 apk 파일이 생성됩니다.

Unreal LoadObject 함수 변수 사용

개요

Unreal 에서 애셋 참조 방법이 여러가지 있습니다. 그 중 LoadObject 함수를 사용하여 경로를 인수로 지정하면 참조 가능합니다. 그런데 상황에 따라 여러가지 애셋을 조건에 따라 참조해야 하는 경우가 있습니다. 이럴 때 어떻게 해야 하는지 알아보도록 하겠습니다.

LoadObject 기본 사용 법

LoadObject 의 기본 사용법을 찾아보면 다음과 같이 되어 있는 경우가 많습니다.

GridTexture = LoadObject<UTexture2D>(NULL, TEXT("/Engine/EngineMaterials/DefaultWhiteGrid.DefaultWhiteGrid"), NULL, LOAD_None, NULL);

TEXT … 이 부분이 하드코딩 되어있는 형태임을 알 수 있습니다. 상황에 따라서 변수로 치환해서 사용하면 코드를 많이 줄일 수 있습니다.

변수 사용 방법

사용할 애셋을 선택하고 우측 마우스 버튼을 클릭하면 다음의 메뉴가 나타납니다.

애셋을 선택 후 마우스 우측 버튼을 클릭하면 나타나는 메뉴

Copy Reference 를 선택하면 다음과 같은 형태의 문자열이 복사됩니다.

/Script/Engine.DataTable'/Game/YourGame/Core/Stage01.Stage01'

위에서 예로 든 문자열에서 Stage01 부분의 숫자를 변수 형태로 바꾸어 참조하면 다음과 같습니다.

FString StageString = "";
//Set your StageString
...
FString StageReference = "/Script/Engine.DataTable'/Game/YourGame/Core/Stage" + StageString + ".Stage" + StageString + "'";
UDataTable* StageDataTable = LoadObject<UDataTable>(NULL, *StageReference, NULL, LOAD_None, NULL);

이렇게 하면 상황에 따라 유연하게 애셋을 참조할 수 있습니다.