이번에도 요약은 맨 아래에
1. Shipping 빌드 및 패키징 에러 현상 및 원인
소스코드 기반의 프로젝트를 Unreal Engine 5(UE5)로 개발하고 나서 배포하려면 'Shipping' 으로 패키징을 해야 한다.
이때, Unreal의 에디터 기능을 소스코드로 개발하고 Shipping으로 빌드 하거나 패키징을 할 때 아래와 같은 오류를 직면하기도 한다.
- UnrealEd 모듈을 사용한 경우를 예시로 작성되었습니다 -
// Shipping_Test.Build.cs
public class Shipping_Test : ModuleRules
{
public Shipping_Test(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "UMG" });
// Added by User
PublicDependencyModuleNames.AddRange(new string[] { "UnrealEd", });
PrivateDependencyModuleNames.AddRange(new string[] { });
}
}
>Unable to instantiate module 'UnrealEd': Unable to instantiate UnrealEd module for non-editor targets.
(프로젝트 세팅이 잘되어 있다면 이딴 거 없다는데...)
구글링을 해보면 대체로 'UE_BUILD_SHIPPING' 전처리기를 활용하라고 나온다.
#if !UE_BUILD_SHIPPING
PublicDependencyModuleNames.AddRange(new string[] { "UnrealEd", });
#endif
(개뿔 동작도 안하더만...)
가장 큰 문제는 Shipping 빌드 구성임에도 전처리가 동작하지 않는 경우가 있다.
이유는 아래 사진 내용 때문이다.
(설마 싶지만 저게 왜 문제냐는 사람을 없을 거라 본다.
0을 제외한 모든 경우는 True 이며, 오로지 0만이 False 이므로 저건 FALSE 처리다...)
2. 에러 처리 방안
원인을 제거하는 방법은 간단하다.
전처리기를 원하는 구성에서 덮어쓰기 하면 된다.
(물론 엔진소스 자체를 수정하라는 건 아니다...)
아래 소스 코드를 Build.cs 파일에 추가하면 빌드 시 전처리 구문이 추가된다.
PublicDefinitions.Add("UE_BUILD_SHIPPING=1");
물론 조건문 없이 넣으면 모든 빌드가 Shipping 이므로 반대로 문제가 생긴다.
따라서 조건문을 추가한 구문은 이와 같다.
if (Target.Configuration == UnrealTargetConfiguration.Shipping) {
PublicDefinitions.Add("UE_BUILD_SHIPPING=1");
}
이제 적용해보자.
// Shipping_Test.Build.cs
public class Shipping_Test : ModuleRules
{
public Shipping_Test(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "UMG" });
if (Target.Configuration == UnrealTargetConfiguration.Shipping) {
PublicDefinitions.Add("UE_BUILD_SHIPPING=1");
}
#if !UE_BUILD_SHIPPING
PublicDependencyModuleNames.AddRange(new string[] { "UnrealEd", });
#endif
PrivateDependencyModuleNames.AddRange(new string[] { });
}
}
위 구문이 될 거 같은가? ㅋ
될 리가 없다. 이미 Build.cs 파일에 있는 생성자까지 진행했는데 있는데 전처리기가 무슨 소용인가 ㅋㅋ
여기까지 읽지 않았다면 요걸 한 번 더 만나고 오면 된다 ㅋㅋㅋ
>Unable to instantiate module 'UnrealEd': Unable to instantiate UnrealEd module for non-editor targets.
최종적으로 Shipping 구성 빌드 시에 'UnrealEd' 모듈을 제거하기 위해서는 아래와 같이 작성하면 된다.
// Shipping_Test.Build.cs
public class Shipping_Test : ModuleRules
{
public Shipping_Test(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "UMG" });
if (Target.Configuration == UnrealTargetConfiguration.Shipping) {
PublicDefinitions.Add("UE_BUILD_SHIPPING=1");
}
else {
// Added by User
PublicDependencyModuleNames.AddRange(new string[] { "UnrealEd", });
}
PrivateDependencyModuleNames.AddRange(new string[] { });
}
}
3. 요약
프로젝트.Build.cs 파일에 아래 소스코드를 추가하자
if (Target.Configuration == UnrealTargetConfiguration.Shipping) {
PublicDefinitions.Add("UE_BUILD_SHIPPING=1");
}
else {
PublicDependencyModuleNames.AddRange(new string[] { "UnrealEd", });
}