[UE 5.3.2] Packaging

김민정·2024년 6월 10일

UnrealEngine

목록 보기
4/10
post-thumbnail

Unreal Engine 5.3.2 버전의 프로젝트 패키징을 공부한 내용입니다.

참고 자료

프로젝트 패키징

https://dev.epicgames.com/documentation/ko-kr/unreal-engine/packaging-unreal-engine-projects?application_version=5.3

Soft 포인터와 Weak 포인터

https://dev.epicgames.com/community/learning/tutorials/kx/unreal-engine-all-about-soft-and-weak-pointers

Forum (StaticLoadClass)

https://forums.unrealengine.com/t/staticloadclass-and-paths/1222376


목표

  • Title -> Lobby -> InGame으로 이어지는 흐름을 UserWidget으로 만들었는데, Shipping 버전에서도 동일하게 동작하는지 확인차 패키징을 해보았다.
  • LAN 상에서 2대의 로컬 머신이 같은 세션에 연결되는 걸 확인하는 것이 목표였다.

Project Setting - Packaging

Packaging 시 Asset 포함 여부

  • Directories to never Cook 옵션에는 원래 Developers 폴더를 넣어놨는데, 테스트할 내용이 해당 폴더 안에 있어서 잠시 변경해줬다.

Build Option

  • Build : 코드 빌드 여부
  • Build Configuration : 빌드 구성 (Shipping, Development, DebugGame 등)
  • Build Target : 플랫폼
  • Full Rebuild : 풀 소스 리빌드 여부
  • 해당 세팅으로 프로젝트 패키징하기

문제와 해결법

1. Widget이 생성되지 않음

void ATitlePC::BeginPlay()
{
	Super::BeginPlay();

	FSoftClassPath TitleWidgetClass(TEXT("/Script/UMGEditor.WidgetBlueprint'/Game/Developers/Programming/5P_MinJeongKim/Blueprints/UI/Title/WB_TitleSample.WB_TitleSample_C'"));
	TObjectPtr<UClass> WidgetClass = TitleWidgetClass.TryLoadClass<UTitleWidgetBase>();

	if (WidgetClass)
	{
		if (IsLocalPlayerController())
		{
			TitleWidget = CreateWidget<UTitleWidgetBase>(this, WidgetClass);
			TitleWidget->AddToViewport();
		}

		SetInputMode(FInputModeUIOnly());
		bShowMouseCursor = true;
	}
}
  • TitlePC에서 TitleWidgetBase를 생성하고, 뷰포트에 추가해주었는데 제대로 생성되지 않아 TitleWidget이 계속 null이었다. 에디터에서는 실행이 잘 됐는데, 패키징을 하니 동작하지 않아서 당황스러웠다.
  • 찾아보니 Soft 포인터는 로드되지 않은 개체여도 참조할 수 있었다. 에디터에서는 Content 폴더에서 찾으면 되니까 실행이 잘 됐지만, 패키징 버전에서는 콘텐츠가 제대로 포함되지 않아 클래스를 못 찾은 것 같다.
void ATitlePC::BeginPlay()
{
	Super::BeginPlay();

	UClass* WidgetClass = StaticLoadClass(UUserWidget::StaticClass(), nullptr, TEXT("/Game/Developers/Programming/5P_MinJeongKim/Blueprints/UI/Title/WB_TitleSample.WB_TitleSample_C"));

	if (WidgetClass)
	{
		if (IsLocalPlayerController())
		{
			TitleWidget = CreateWidget<UTitleWidgetBase>(this, WidgetClass);
			TitleWidget->AddToViewport();
		}

		SetInputMode(FInputModeUIOnly());
		bShowMouseCursor = true;
	}
}
  • StaticLoadClass로 로드하여 해결하기는 하였으나, 문자열로 하드코딩하여 에셋을 로드하는 것은 권장되지 않는다. 하지만 위젯의 경우, 블루프린트에서 레이아웃을 만들고 C++에서 이를 참조해 커스텀 기능을 추가하는 것이 효과적이라고 생각된다. 패키징 된 에셋에서 어떻게 경로를 탐색하는지 잘 몰라서 조금 더 찾아볼 생각이다.

2. Binaries 폴더 내 실행파일 참조

  • Binaries 폴더는 컴파일 도중 생성된 실행 파일과 dll이 포함된다. C++로 코드를 작성하고, 이를 프로젝트에 사용하고 있다면 필수적으로 포함해주어야 하는 것 같다.
  • 원하는 모드로 (Shipping, Development 등) 솔루션에서 소스를 빌드하고 최신 버전의 Binaries 폴더를 만든 후, 에디터 내에서 패키징을 해야 제대로 동작할 듯 하다.
profile
📝 공부노트

0개의 댓글