본문 바로가기
Unreal/[서적] 언리얼5 이득우님 인프런1

Ch 15. 언리얼 빌드 시스템

by GameStudy 2023. 5. 13.

15.1 언리얼 에디터 프로젝트 구성

15.1-1 언리얼 에디터의 구성

  - 언리얼 엔진의 구성

    에디터: 게임 제작을 위해 제공되는 응용 프로그램(일반적으로 인식하는 언리얼 엔진)

    게임빌드: .exe 파일과 리소스로 이뤄진 독립적으로 동작하는 게임 클라이언트

  - 언리얼 에디터의 특징

    게임 개발 작업을 위해 다양한 폴더와 파일 이름 규칙이 미리 설정되어 있음.

    정해진 규칙을 잘 파악하고 프로젝트 폴더와 파일을 설정해야 함.

  - 에디터에서 기획과 개발을 완료한 후, 게임 빌드를 통해 최종 게임 빌드를 제작하도록 설정

 

15.1-2 언리얼 에디터의 동작

  - 프로젝트 폴더의 .uproject 파일을 더블클릭하면 에디터가 실행됨.

  - 에디터의 실행 방식

    .uproject 확장자는 윈도우 레지스트리에 등록되어 있음.

    등록이 안되어 있다면 런처를 실행하면 등록됨.

    UnrealVersionSelector 프로그램으로 프로젝트 정보가 넘겨짐

    UnrealVersionSelector는 런처가 저장한 에디터 정보로부터 버전에 맞는 에디터를 실행함.

  - UnrealVersionSelector 소스는 에픽게임즈 GitHub에서 확인가능

 

15.1-3 에디터가 언리얼 버전 정보를 파악하는 방법

  - .uproject 파일에 정해져 있음.

    .uproject 확장자는 에디터를 띄우기 위한 명세서 역할을 함.

    버전 내용은 Json 형식으로 구성되어 있음.

  - 파일에 기록된 버전 정보를 바탕으로 에픽 런처가 지정한 정보를 찾아 에디터를 실행함.

    ProgramData/Epic/UnrealLauncher 폴더에 관련 정보가 있음.

    이 역시 Json 형식으로 설치된 언리얼 버전 정보가 기록되어 있음.

 

15.1-4 .uproject 파일 실습

  - UnrealBuildSystem 폴더 생성

    새 txt 파일 > UnrealBuildSystem.uproject 파일 생성

  - UnrealBuildSystem.uproject 실행하면 폴더들이 자 생성됨.

<hide/>

// UnrealBuildSystem.uproject

{
	"FileVersion": 3,
	"EngineAssociation": "5.1",
}

 

15.1-5 블루프린트 프로젝트

  - C++ 코드가 없는 언리얼 프로젝트를 블루프린트 프로젝트라 함.

    언리얼 엔진이 제공하는 기본 기능을 활용해 게임을 제작하는 프로젝트.

  - 언리얼 엔진은 게임 제작에 필요한 기능을 모듈이라는 단위로 제공하고 있음.

    언리얼 엔진의 모듈을 상속받아 블루프린트를 활용해 모든 기능과 로직을 구현하는 방식.

 

15.1-6 언리얼 C++ 프로젝트

  - 언리얼 엔진 C++ 모듈에 개발자가 추가로 자신만의 C++ 모듈을 추가할 수 있음.

    언리얼 엔진 모듈과 개발자 모듈을 함께 사용하는 프로젝트

 

15.1-7 언리얼 C++ 모듈

  - 언리얼 엔진의 소스코드는 모두 모듈 단위로 구성되어 있음.

    모듈을 컴파일함으로서 에디터 및 게임에 우리가 제작한 로직을 공급할 수 있음.

  - 모듈 단위로 구성된 C++ 소스 코드를 컴파일한 결과물

    에디터용으로 DLL 동적 라이브러리

    게임용으로는 정적 라이브러리

  - 에디터용 모듈은 언제나 UnrealEditor-{모듈이름}.dll 이름 규칙을 가지고 있음.

    언리얼 엔진 설치 폴더에 가면 수많은 에디터 모듈을 볼 수 있음.

 

15.1-8 언리얼 C++ 모듈의 추가

  - 기존 언리얼 모듈에 우리가 제작한 C++ 모듈을 추가해 에디터를 띄우고 싶은 경우.

    우리가 만든 에디터 모듈(.dll 동적 라이브러리)을 빌드 폴더에 넣어줘야함.

    Windows의 경우 Binaries/Win64 폴더에 해당 .dll 파일을 넣어야 함.

    빌드된 모듈 목록이 있는 UnrealEditor.modules 파일도 같은 폴더에 넣어주어야 인식 됨.

  - .uproject 명세서에 모듈 이름을 추가하고 에디터 실행.

    아래와 같이 작성하고 실행하면 CDO 관련 에러가 나지만, 일단 로드는 되었음을 알 수 있음.

<hide/>

// UnrealBuildSystem.uproject

{
	"FileVersion": 3,
	"EngineAssociation": "5.1",
	"Modules": [
		{
			"Name": "UnrealSerialization",
			"Type": "Runtime"
		}
	]
}

 

15.1-9 모듈 C++ 코드의 관리

  - 언리얼 프로젝트가 소스코드를 관리하는 규칙에 따라 소스코드 구조를 구성해야 함.

    소스코드는 멀티 플랫폼 빌드 시스템을 지원하기 위해 특정 프로그램에 종속되어 있지 않음.

  - 실제 빌드를 진행하는 주체는 Unreal Build Tool 이라는 C# 프로그램.

    Source 폴더에 지정된 규칙대로 소스를 넣으면 플랫폼에 맞춰서 알아서 컴파일이 진행됨.

 

15.1-10 Source 폴더의 구조

  - Source 폴더

    타겟 설정 파일

    모듈 폴더(보통은 프로젝트 이름으로 모듈 이름을 지정)

      모듈 설정 파일

      소스 코드 파일

  - 타겟 설정 파일: 전체 솔루션이 다룰 빌드 대상을 지정함.

    {프로젝트이름}.Target.cs: 게임 빌드 설정.

    {프로젝트이름}Editor.Target.cs: 에디터 빌드 설정.

  - 모듈 설정 파일: 모듈을 빌드하기 위한 C++ 프로젝트 설정 정보.

    {모듈이름}.Build.cs: 모듈을 빌드하기 위한 환경 설정.

  - C#이 가진 compile on-the-fly 기능을 활용해

    런타임 중에 .cs 파일을 읽고 빌드 환경을 구축하여 컴파일을 진행함.

 

15.1-11 게임 프로젝트의 소스

  - 내가 만든 소스코드가 게임 프로젝트의 C++ 모듈이 되기 위해 필요한 것은 다음과 같음

  - 모듈을 선언하고 구현한 header 파일과 cpp 파일이 있어야함.

    주로 {모듈이름}.h와 {모듈이름}.cpp로 지정함.

  - 모듈의 뼈대를 제작

    매크로를 통해 기본 뼈대 구조를 제작함.

    IMPLEMENT_MODULE: 일반 모듈

    IMPLEMENT_GAME_MODULE: 게임 모듈

    IMPLEMENT_PRIMARY_GAME_MODULE: 주 게임 모듈

  - 일반적으로 게임 프로젝트는 주 게임 모듈을 하나 선언해야 함.

  - 모든 준비가 완료되면 Generate Visual Studio project files 메뉴 클릭.

    Intermediate 폴더에 프로젝트 관련 파일이 자동으로 생성됨.

    Source 폴더를 규칙에 맞게 구성했다면 Intermediate 폴더는 언제든지 재생성이 가능함.

 

15.1-12  게임 모듈 생성

  - Binaries 폴더가 있다면 삭제 후 아래와 같이 작성.

    Source 폴더 생성

    Source > UnrealBuildSystem 폴더 생성

    Source > UnrealBuildSystemEditor.Target.cs 생성 후 아래와 같이 작성

    UnrealBuildSystem > UnrealBuildSystem.Build.cs 생성 후 아래와 같이 작성

    UnrealBuildSystem > UnrealBuildSystem.h와 UnrealBuildSystem.cpp 생성

  - UnrealBuildSystem.uproject 파일 우클릭 > Generate Visual Studio Project 클릭

<hide/>

// UnrealBuildSystem.uproject

{
	"FileVersion": 3,
	"EngineAssociation": "5.1",
	"Category": "",
	"Description": "",
	"Modules": [
		{
			"Name": "UnrealBuildSystem",
			"Type": "Runtime",
			"LoadingPhase": "Default",
			"AdditionalDependencies": [
				"CoreUObject"
			]
		}
	]
}
<hide/>

// UnrealBuildSystem.Target.cs

using UnrealBuildTool;
using System.Collections.Generic;

public class UnrealBuildSystemEditorTarget : TargetRules
{
	public UnrealBuildSystemEditorTarget( TargetInfo Target) : base(Target)
	{
		Type = TargetType.Editor;
		DefaultBuildSettings = BuildSettingsVersion.V2;
		IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_1;
		ExtraModuleNames.Add("UnrealBuildSystem");
	}
}
<hide/>

// UnrealBuildSystem.Build.cs

using UnrealBuildTool;

public class UnrealBuildSystem : ModuleRules
{
	public UnrealBuildSystem(ReadOnlyTargetRules Target) : base(Target)
	{
		PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
	
		PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "CommonUtility" });

		PrivateDependencyModuleNames.AddRange(new string[] { });

		// Uncomment if you are using Slate UI
		// PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" });
		
		// Uncomment if you are using online features
		// PrivateDependencyModuleNames.Add("OnlineSubsystem");

		// To include OnlineSubsystemSteam, add it to the plugins section in your uproject file with the Enabled attribute set to true
	}
}

  - 아래와 같이 작성 후 새 C++ 클래스 > Object 부모 클래스 > "Student" 클래스 생성

<hide/>

// UnrealBuildSystem.h

#pragma once

#include "CoreMinimal.h"
<hide/>

// UnrealBuildSystem.h

#include "UnrealBuildSystem.h"
#include "Modules/ModuleManager.h"

IMPLEMENT_PRIMARY_GAME_MODULE(FDefaultGameModuleImpl, UnrealBuildSystem, "UnrealBuildSystem");

 

15.1-12 모듈 간의 종속 관계

  - 모듈 사이에 종속 관계를 설정해 다양한 기능을 구현할 수 있음.

    우리가 만드는 게임 모듈도 언리얼 엔진이 만든 모듈을 활용해야 함.

    언리얼 엔진이 제공하는 모듈 사이에도 종속 관계가 있음.

 

 

15.1-13 새로운 모듈의 추가

  - 하나의 모듈에 너무 많은 코드가 들어가면 언리얼 엔진은 빌드 방식을 변경함.

    그렇기에 프로젝트가 커질수록 모듈을 나누어서 관리하는 것이 유리함.

 

15.1-14 모듈의 공개와 참조

  - 모듈 내 소스코드를 필요한 만큼만 공개해야 모듈 간의 의존성을 줄이고

    컴파일 타임을 최소화 할 수 있음.

  - 공개할 파일은 모두 Public 폴더로 옮김.

    예외적으로 예전 UE는 Classes 폴더가 Public 폴더 역할.

    외부로 공개할 클래스 선언에는 {모듈이름}_DLL 매크로를 붙혀야함.
  - 숨길 파일은 모두 Private 폴더로 옮김.

  - 게임 모듈에서는 Bulid.cs 설정을 통해 참조할 모듈을 지정할 수 있음.

 

15.1-15 플러그인 시스템

  - 게임 프로젝트 소스에 모듈을 추가하는 방법은 분업이 어렵다는 단점이 있음.

    모듈만 독립적으로 동작하는 플러그인 구조를 만들어 분업화하는 것이 바람직함.

 

15.1-16 플러그인 구조

  - 플러그인은 다수의 모듈과 게임 컨텐츠를 포함하는 포장 단위.

    에디터 설정을 통해 유연하게 플러그인을 추가하거나 삭제할 수 있음.

  - 플러그인 구조

    플러그인 명세서(.uplugin 파일)

    플러그인 리소스(Resource 폴더, 에디터 메뉴용 아이콘)

    컨텐츠

    모듈 폴더

  - 이러한 플러그인은 마켓 플레이스 판매로도 이어질 수 있도록 여러 설정을 추가할 수 있음.

 

15.1-16 플러그인 실습

  - Plugins 폴더 생성

  - Plugins > GameUtility 폴더 생성

    GameUtility.uplugin 파일 생성 후 아래와 같이 작성

    Source 폴더 생성

  - Source > CommonUtility 폴더 생성

    CommonUtility.Build.cs / CommonUtility.h / CommonUtility.cpp

<hide/>

// GameUtility.uplugin

{
	"FileVersion": 3,
	"Version": 1,
	"VersionName": "1.0",
	"FriendlyName": "GameUtility", 
	"Modules": [
		{
			"Name": "CommonUtility",
			"Type": "Runtime",
			"LoadingPhase": "Default"
		}
	]
}
<hide/>

// CommonUtility.Build.cs

using UnrealBuildTool;

public class CommonUtility : ModuleRules
{
	public CommonUtility(ReadOnlyTargetRules Target) : base(Target)
	{
		PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
	
		PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" });

		PrivateDependencyModuleNames.AddRange(new string[] { });

		// Uncomment if you are using Slate UI
		// PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" });
		
		// Uncomment if you are using online features
		// PrivateDependencyModuleNames.Add("OnlineSubsystem");

		// To include OnlineSubsystemSteam, add it to the plugins section in your uproject file with the Enabled attribute set to true
	}
}
<hide/>

// CommonUtility.h

#pragma once

#include "CoreMinimal.h"
<hide/>

// CommonUtility.cpp

#include "CommonUtility.h"
#include "Modules/ModuleManager.h"

IMPLEMENT_MODULE(FDefaultModuleImpl, CommonUtility);

  - 빌드 후 새 C++ 클래스 생성 > Object 부모 클래스 > Person 클래스 생성

    이때 Plugin을 CommonUtility으로 지정

  - 새 C++ 클래스 > Object 부모 클래스 > PersonImpl 클래스 생성

    Plugin을 CommonUtility으로 지정

  - CommonUtility > Public 폴더와 Private 폴더 생성

    소스코드 파일 정리

<hide/>

// Person.h

#pragma once

#include "CoreMinimal.h"
#include "UObject/NoExportTypes.h"
#include "Person.generated.h"

UCLASS()
class COMMONUTILITY_API UPerson : public UObject
{
	GENERATED_BODY()
	
};
<hide/>

// Person.cpp

#include "Person.h"
<hide/>

// PersonImpl.h

#pragma once

#include "CoreMinimal.h"
#include "UObject/NoExportTypes.h"
#include "PersonImpl.generated.h"

UCLASS()
class UPersonImpl : public UObject
{
	GENERATED_BODY()
	
};
<hide/>

// PersonImpl.cpp

#include "PersonImpl.h"
// UnrealBuildSystem.Build.cs

...

public class UnrealBuildSystem : ModuleRules
{
	public UnrealBuildSystem(ReadOnlyTargetRules Target) : base(Target)
	{
		...
	
		PublicDependencyModuleNames.AddRange(new string[] { ..., "Engine", "InputCore", "CommonUtility" });


	...
    }
}

 

15.1-17 게임 빌드

  - 게임 타겟 설정을 추가하면 게임 빌드 옵션이 추가됨.

    게임 타겟으로 빌드된 모듈은 정적 라이브러리로 실행 파일에 포함됨.

  - 게임이 실행되기 위해서는 실행 파일과 컨텐츠 애셋이 함께 있어야함.

    빌드: 실행 파일을 생성하기 위한 컴파일.

    쿠킹: 지정한 플랫폼에 맞춰 컨텐츠 애셋을 변환하는 작업.

    패키징: 이들을 모두 모아서 하나의 프로그램으로 만드는 작업.

 

15.1-18 게임 빌드 실습

  - UnrealBuildSystem > Source > UnrealBuildSystem.Target.cs 생성 및 아래와 같이 작성

    Generate Visual Studio Project 클릭. 그럼 빌드 타겟이 추가됨.

    Shipping 빌드 타겟 지정 후 빌드

  - Binaries > UnrealBuildSystem-Win64-Shipping.exe 생성됨. 실행하면 에셋이 없어서 안됨. 쿠킹이 필요함.

    다시 빌드 타겟을 Development Editor 지정 후 빌드. 

    Platforms > Windows > Package Project 클릭 하면 쿠킹과 패키징을 동시에 진행해줌.

    다이얼로그가 뜨면 Package 폴더 생성 후 선택하면 자동으로 진행됨.

<hide/>

// Copyright Epic Games, Inc. All Rights Reserved.

using UnrealBuildTool;
using System.Collections.Generic;

public class UnrealBuildSystemTarget : TargetRules
{
	public UnrealBuildSystemTarget( TargetInfo Target) : base(Target)
	{
		Type = TargetType.Game;
		DefaultBuildSettings = BuildSettingsVersion.V2;
		IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_1;
		ExtraModuleNames.Add("UnrealBuildSystem");
	}
}

 

'Unreal > [서적] 언리얼5 이득우님 인프런1' 카테고리의 다른 글

Ch 14. 패키지  (0) 2023.05.13
Ch 13. 직렬화  (0) 2023.05.13
Ch 12. 언리얼 엔진의 메모리 관리  (0) 2023.05.13
Ch 11. 구조체와 Map  (0) 2023.05.13
Ch 10. Array and Set  (0) 2023.05.12

댓글