본문 바로가기

Unreal

UE C++ 빌드 시스템

 

언리얼 에디터 구성

  • 게임 제작을 위해 에픽 게임즈가 제공하는 저작 도구
  • 언리얼 엔진의 구성
    • 에디터 : 게임 제작을 위해 제공되는 응용 프로그램 ( 일반적으로 인식하는 언리얼 엔진)
    • 게임 빌드 : EXE 파일과 리소스로 이루어진 독립적으로 동작하는 게임 클라이언트
  • 언리얼 에디터의 특징
    • 게임 개발 작업을 위해 다양한 폴더와 파일 이름 규칙이 미리 설정.
    • 정해진 규칙을 잘 파악하고 프로젝트 폴더와 파일을 설정.
  • 에디터에서 기획과 개발을 완료한 후, 게임 빌드를 통해 최종 게임 빌드를 제작하도록 설정

 

에디터 버전 정보의 파악

  • 프로젝트 .uproject 텍스트 파일에 버전 정보가 정의.
  • .uproject 확장자는 에디터를 띄우기 위한 명세서 역할
  • 버젼 내용은 JSON 형식으로 구성.
  • 파일에 기록된 버전 정보를 바탕으로 에픽 런처가 지정한 정보를 찾아 에디터를 실행
    • ProgramData/Epic/UnrealLauncher 폴더에 관련 정보
    • 이 역시 JSON 형식으로 설치된 언리얼 버전 정보 기록

 

프로젝트 구조

  • config : 설정 파일
  • content : 애셋 정보들
  • DerivedDataCache : 애셋 정보들을 Caching
  • Intermediate : 임시적으로 사용되는 중간 결과물들을 보관하는 용도
  • Saved : 임시로 무엇인가를 저장하는데 사용하는 폴더

 

언리얼 C++ 모듈

  • 언리얼 엔진의 소스코드는 모두 모듈(Module) 단위로 구성.
  • 모듈을 컴파일함으로서 에디터 및 게임에 우리가 제작한 로직을 공급
  • 모듈 단위로 구성된 C++ 소스 코드를 컴파일한 결과물
    • 에디터 용으로 DLL 동적라이브러리
    • 게임 용으로는 정적 라이브러리
  • 에디터 용 모듈은 언제나 UnrealEditor-{모듈이름}.DLL 이름 규칙을 가지고 있음.



언리얼 C++ 모듈의 추가

  • 기본 언리얼 모듈에 우리가 제작한 C++ 모듈을 추가해 에디터를 띄우고 싶은 경우.
  • 우리가 만든 에디터 모듈(DLL 동적라이브러리)을 빌드 폴더에 넣어주어야 함.
    • Windows의 경우 Binaries/Win64 폴더에 해당 DLL을 넣어야 함
    • 빌드된 모듈 목록이 있는 UnrealEditor.modules 파일도 같은 폴더에 넣어주어야 인식
  • uproject 명세서에 모듈 이름을 지정하고 에디터를 실행.

모듈 C++ 코드의 관리

  • 언리얼 프로젝트가 소스 코드를 관리하는 규칙에 따라 소스 코드 구조를 구성
  • 소스 코드는 멀티 플랫폼 빌드 시스템을 지원하기 위해 특정 프로그램에 종속되어 있지 않음.
  • 실제 빌드를 진행하는 주체 : Unreal Build Tool 이라는 C# 프로그램
  • Source 폴더에 지정된 규칙대로 소스를 넣으면 플랫폼에 맞춰서 알아서 컴파일을 진행.
  • 소스 코드 → Unreal Build Tool → OS 별 컴파일러 실행.

 

Source 폴더 구조

  • Source 폴더
    • 타겟 설정 파일
    • 모듈 폴더 ( 보통은 프로젝트 이름으로 모듈 이름을 지정)
      • 모듈 설정 파일
      • 소스 코드 파일 (.h 및 .cpp 파일들)
  • 타겟 설정 파일 : 전체 솔루션이 다룰 빌드 대상을 지정함.
    • {프로젝트 이름}.Target.cs : 게임 빌드 설정
    • {프로젝트 이름} Editor.Target.cs : 에디터 빌드 설정
  • 모듈 설정 파일 : 모듈을 빌드하기 위한 C++ 프로젝트 설정 정보
    • {모듈이름}.Build.cs : 모듈을 빌드하기 위한 환경 설정
  • C#이 가진 유연한 기능(compile on-the-fly)을 활용해 런타임에 cs 파일을 읽어 빌드 환경을 구축하고 컴파일을 진행.


게임 프로젝트의 소스

  • 내가 만든 소스가 게임 프로젝트의 C++ 모듈이 되기 위해 필요한 것
  • 모듈(Module)을 구현한 선언한 헤더와 소스 파일이 있어야 함.
    • 주로 {모듈이름}.h와 {모듈이름}.cpp로 지정함
  • 모듈의 뼈대를 제작
    • 매크로를 통해 기본 뼈대 구조를 제작
      • IMPLEMENT_MODULE : 일반 모듈
      • IMPLEMENT_GAME_MODULE : 게임 모듈
      • IMPLEMENT_PRIMARY_GAME_MODULE : 주 게임 모듈
  • 일반적으로 게임 프로젝트는 주 게임 모듈을 하나 선언
  • 모든 준비가 완료되면 Generate Visual Studio project files. 메뉴를 선택
    • Intermediate 폴더에 프로젝트 관련 파일이 자동으로 생성
    • Source 폴더를 규칙에 맞게 구성하면 Intermediate 폴더는 언제든지 재생성이 가능

 

메인 모듈 등록

 

<ProjectName>.Target.cs

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

using UnrealBuildTool;
using System.Collections.Generic;

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

Source 폴더 안에 생성.

 

 

<ProjectName>.Build.cs

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

using UnrealBuildTool;

public class UnrealBuildSystem : ModuleRules
{
	public UnrealBuildSystem(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 proejct file with the Enabled attribute set to true
	}
}

source 폴더 안에 UnrealBuildSystem 이라는 폴더를 생성 후 안에 생성

 

 

<ProjectName>.cpp, h 생성

// header
#pragma once

#include "CoreMinimal.h"

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

IMPLEMENT_PRIMARY_GAME_MODULE(FDefaultGameModuleImpl, UnrealBuildSystem, "UnrealBuildSystem");

 

 

UnrealBuildTool에 의해서 소스 코드 내 구조를 분석

관련된 Visual Studio 프로젝트를 Intermediate폴더에 생성.

 

 

플러그인 시스템

  • 게임 프로젝트 소스에 모듈을 추가하는 방법은 분업이 어렵다는 단점이 있음.
  • 모듈만 독립적으로 동작하는 플러그인 구조를 만들어 분업화하는 것이 바람직함.


플러그인 구조

  • 플러그인은 다수의 모듈과 게임 콘텐츠를 포함하는 포장 단위
  • 에디터 설정을 통해 유연하게 플러그인을 추가하거나 삭제 가능
  • 플러그인 구조
    • 플러그인 명세서 (uplugin 파일)
    • 플러그인 리소스 (Resource 폴더, 에디터 메뉴용 아이콘)
    • 콘텐츠
    • 모듈 폴더
  • 이러한 플러그인은 마켓 플레이스 판매로도 이어질 수 있도록 여러 설정을 추가.


플러그인 만들기

  1. Plugins 폴더 생성
  2. <FileName>.uplugin
{
	"FileVersion": 3,
	"Version":1,
	"VersionName":"1.0",
	"FriendlyName":"GameUtility",
	"Modules": [
		{
			"Name":"CommonUJtility",
			"Type":"Runtime",
			"LoadingPhase": "Default"
		}
	]
}

3.  모듈이 들어갈 Source 폴더 생성

 


새로운 모듈로 Class 생성

 

 

 

플러그인 생성 후 프로젝트 구조 변경

외부에 노출할 것들은 Public에, 노출하지 않을 것들은 Private에 구성
이 때 Private의 Header는 <PluginsName>_API를 지움으로써 외부 참조가 불가능하게 함

 

 

플러그인의 사용

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

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 proejct file with the Enabled attribute set to true
	}
}

<ProjectName>.Build.cs 파일에 이전에 생성한 플러그인 CommonUtility를 추가하면 해당 모듈의 소스 코드를 자유롭게 사용 가능합니다.
CommonUtility를 주 게임 모듈에 추가하면 주 게임 모듈은 플러그인 CommonUtility를 참조하게 됩니다.
다만 주 게임 모듈을 참조하는 다른 Build.cs 파일이 있는 것은 언리얼 설계상 좋지 않으므로
<ProjectName>.Build.cs 파일은 사실상 최종 종착지입니다.

 

 

게임 빌드

  • 게임 타겟 설정을 추가하면 게임 빌드 옵션이 추가
  • 게임 타겟으로 빌드된 모듈은 정적 라이브러리로 실행 파일에 포함
  • 게임이 실행되기 위해서는 실행 파일과 콘텐츠 애셋이 함께 있어야 함.
  • 쿠킹 : 지정한 플랫폼에 맞춰 콘텐츠 애셋을 변환하는 작업
  • 패키징 : 이들을 모두 모아서 하나의 프로그램으로 만드는 작업.
  • /Source/<ProjectName>.Target.cs
// 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");
	}
}



실행파일 생성

  • 빌드 옵션에서 Shipping 선택 하면 .exe 실행 파일이 생성.
  • Shipping 생성에 앞서서 선행 과정이 필요함
  • 게임 실행파일은 만들었지만 게임 실행에 필요한 애셋 모음들이 필요한데
    게임 애셋들을 선택한 플랫폼에서 사용할 수 있는 포맷으로 컨텐츠들을 변환하는 과정입니다.
    ex) 안드로이드, 윈도우즈 등등
  • 쿠킹 만들기

Package Project 메뉴 선택시 쿠킹이 일어나고 실행파일이 생성됨.

 

 

 

참고

 

이득우의 언리얼 프로그래밍 Part1 - 언리얼 C++의 이해 | 이득우 - 인프런

이득우 | 대기업 현업자들이 수강하는 언리얼 C++ 프로그래밍 전문 과정입니다. 언리얼 엔진 프로그래머라면 게임 개발전에 반드시 알아야 하는 언리얼 C++ 기초에 대해 알려드립니다., [사진] 언

www.inflearn.com

수강하고 작성한 글입니다.

'Unreal' 카테고리의 다른 글

UE 캐릭터 입력 시스템  (0) 2024.06.15
UE 액터 컴포넌트  (1) 2024.06.08
UE C++ 직렬화  (0) 2024.05.25
UE C++ 메모리 관리  (0) 2024.05.19
UE C++ Design - Interface  (0) 2024.04.27