언리얼 에디터 구성
언리얼 엔진의 구성
- 에디터 : 게임 제작을 위해 제공되는 응용 프로그램 (일반적으로 인식하는 언리얼 엔진)
- 게임 빌드 : EXE 파일과 리소스로 이루어진 독립적으로 동작하는 게임 클라이언트
언리얼 에디터의 특징
- 게임 개발 작업을 위해 다양한 폴더와 파일 이름 규칙이 미리 설정되어 있다.
- 정해진 규칙을 잘 파악하고 프로젝트 폴더와 파일을 설정해야 함.
에디터에서 기획과 개발을 완료한 후, 게임 빌드를 통해 최종 게임 빌드를 제작하도록 설정
언리얼 에디터의 동작
프로젝트 폴더의 uproject 확장자를 더블클릭하면 에디터가 트리거됨.
에디터의 실행 방식
- uproject 확장자는 윈도우 레지스트리에 등록되어 있음.
- 등록이 안되어 있다면 런처를 실행해 등록
- UnrealVersionSelector 프로그램으로 프로젝트 정보가 넘겨짐
- UnrealVersionSelector는 런처가 저장한 에디터 정보로부터 버전에 맞는 에디터를 실행함
UnrealVersionSelector 소스는 에픽게임즈 Github에서 확인 가능
https://github.com/EpicGames/UnrealEngine/tree/release/Engine/Source/Programs/UnrealVersionSelector
에픽 게임즈 계정과 Github 계정이 연동되어 있어야 접근가능함.
UnrealVersionSelector가 uproject 확장자와 연동되어 있음. 이 프로그램을 실행하면 현재 uproject에 있는 정보를 기반으로 버전에 맞는 언리얼 에디터를 런칭.
그렇다면 UnrealVersionSelector는 어떻게 해당 버전의 에디터가 설치되어 있는 경로를 알고 이것을 실행하나?
에픽게임즈 런처에 언리얼 엔진을 설치했기 때문에 런처에 해당 정보가 들어있음.
에디터 버전 정보의 파악
프로젝트.uproject 텍스트 파일에 버전 정보가 정해져있음.
.uproject 확장자는 에디터를 띄우기 위한 명세서 역할을 함
버전 내용은 JSON 형식으로 구성되어 있음.
파일에 기록된 버전 정보를 바탕으로 에픽 런처가 지정한 정보를 찾아 에디터를 실행.
- ProgramData/Epic/UnrealLauncher 폴더에 관련 정보가 있음.
- 이 역시 JSON 형식으로 설치된 언리얼 버전 정보가 기록되어 있음.
실습 예제
비어 있는 폴더에서 언리얼 프로젝트 생성
프로젝트를 만들 곳에 빈 폴더 생성
해당 폴더 안에 프로젝트 이름으로 된 uproject 파일을 텍스트 파일로 생성
두가지 필드를 가진 오브젝트를 Json 형식으로 지정
확장자를 .uproject로 변경 후 더블 클릭하면 레지스트리에 기록된 정보에 의해 UnrealVersionSelector 프로그램이 실행됨
버전 셀렉터는 파일 안에 명시된 버전 정보를 에픽 게임즈 런처로부터 찾아서 해당 에디터를 실행해줌
더블클릭하여 에디터가 자동으로 실행되고 5개의 폴더가 생성되었음
Config: 프로젝트 설정에 필요한 정보를 보관하는데 사용
Content: 애셋 보관에 사용
DerivedDataCache: 우리가 사용하는 애셋들의 주요 정보를 미리 캐싱해두는 역할로 사용
데이터 캐시 값이 있으면 로딩이 빨라짐. 용량이 급하다면 지워도 동작에는 문제 없음
Intermediate: 임시적으로 사용되는 중간 결과물들을 보관하는 용도로 사용
언제든지 임의로 삭제해도 무방
Saved: 임시로 무언가를 저장하는 용도로 사용
의도적으로 어떤 데이터를 저장하지 않았다면 지워도 큰 문제없음
이렇게 생성된 프로젝트는 블루프린트 프로젝트임.
블루프린트 프로젝트
C++ 코드가 없는 언리얼 프로젝트
언리얼 엔진이 제공하는 기본 기능을 활용해 게임을 제작하는 프로젝트
언리얼 엔진은 게임 제작에 필요한 기능을 모듈이라는 단위로 제공하고 있음
언리얼 엔진의 모듈을 상속받아 블루프린트를 활요해 모든 기능과 로직을 구현하는 방식
언리얼 C++ 프로젝트
언리얼 엔진 C++ 모듈에 개발자가 추가로 자신만의 C++ 모듈을 추가할 수 있음.
언리얼 엔진 모듈과 개발자 모듈을 함께 사용하는 프로젝트
개발자가 만든 C++ 모듈을 언리얼 엔진 모듈과 블루프린트 모듈 사이에 넣어 블루프린트로 게임을 제작할 때 두 가지 모듈을 다 사용할 수 있게 구조를 변경할 수 있음
언리얼 C++ 모듈
모듈: 소스 코드를 관리하는 하나의 단위
언리얼 엔진의 소스코드는 모두 모듈(Module) 단위로 구성되어 있음.
모듈을 컴파일함으로서 에디터 및 게임에 우리가 제작한 로직을 공급할 수 있음.
모듈 단위로 구성된 C++ 소스 코드를 컴파일한 결과물
- 에디터 용으로 DLL 동적 라이브러리
- 게임 용으로는 정적 라이브러리
에디터 용 모듈은 언제나 UnrealEditor-{모듈이름}.DLL 이름 규칙을 가지고 있음.
언리얼 엔진 설치 폴더에 가면 수많은 에디터 모듈이 설치되어 있음.
언리얼 C++ 모듈의 추가
언리얼 에디터 모듈과 같은 형태로 모듈을 만들면 에디터에 직접 만든 기능을 집어 넣어서 블루프린트도 제공할 수 있게 됨.
기본 언리얼 모듈에 우리가 제작한 C++ 모듈을 추가해 에디터를 띄우고 싶은 경우
우리가 만든 에디터 모듈(DLL 동적 라이브러리)을 빌드 폴더에 넣어주어야 함.
- Windows의 경우 Binaries/Win64 폴더에 해당 DLL을 넣어야함
- 빌드된 모듈 목록이 있는 UnrealEditor.modules 파일도 같은 폴더에 넣어주어야 인식됨.
uproject 명세서에 모듈 이름을 지정해서 시작할 때 에디터가 이러한 모듈을 찾아서 로딩해야한다고 명시해주어야 함.
실습 예제
→
이전 프로젝트에서 빌드된 결과물들이 들어있는 Binaries를 복사해 생성했던 파일에 붙여넣기
UnrealBuildSystem 프로젝트의 명세서를 열어 모듈 필드 추가
모듈 Array에는 들어가는 객체는 Name과 Type 속성을 가짐
Name에는 모듈의 이름을 넣고 Type에는 게임과 에디터에서 항시 사용해야하는 중요한 게임 기능이라는 의미의 Runtime 지정.
쉼표나 따옴표 등의 오타 주의. 오타가 있으면 실행되지 않음
더블클릭해 실행하면 생성자 코드에서 애셋이 없어 에러 발생. 확인 후 로딩을 끝내면
UnrealSerialization 모듈 폴더가 있고 만들었던 언리얼 오브젝트들도 나열되어 있음.
모듈 C++ 코드의 관리
언리얼 프로젝트가 소스 코드를 관리하는 규칙에 따라 소스 코드 구조를 구성해야 함.
소스 코드는 멀티 플랫폼 빌드 시스템을 지원하기 때문에 특정 프로그램의 구조를 따르지 않고 언리얼만의 규칙을 가짐.
예를 들어 VS로 개발을 진행하더라도 VS와는 100% 무관하게 구성됨.
실제 빌드를 진행하는 주체 : Unreal Build Tool 이라는 C# 프로그램
Source 폴더에 지정된 규칙대로 소스를 넣으면 플랫폼에 맞춰 알아서 컴파일을 진행.
Source 폴더의 구조
Source 폴더
- 타겟 설정 파일
- 모듈 폴더 (보통은 프로젝트 이름으로 모듈 이름을 지정)
- 모듈 설정 파일
- 소스 코드 파일 (.h 및 .cpp 파일들)
하나의 모듈을 만들기 위해 두 가지 설정 파일을 지정해 주어야함.
- 타겟 설정 파일 : 전체 프로젝트 관점에서 솔루션이 다룰 빌드 대상을 지정함.
- {프로젝트 이름}.Target.cs : 게임 빌드 설정
- {프로젝트 이름}Editor.Target.cs : 에디터 빌드 설정
- 이 외에도 프로그램이나 서버와 같은 다른 설정 파일도 있음.
- 모듈 설정 파일 : 하나의 모듈을 빌드하기 위해 추가해야할 C++ 프로젝트 정보를 추가하는 파일. 모듈을 빌드하기 위해 참조할 다른 모듈에 대한 정보를 지정하는 곳.
- {모듈 이름}.Build.cs : 모듈을 빌드하기 위한 환경 설정
- 일반적으로 외부에서 누군가가 만든 라이브러리를 사용해서 C++프로그램을 제작하게 되면 외부 라이브러리에서 제공하는 헤더가 담긴 폴더 정보를 지정하고 함께 링크할 라이브러리 정보도 지정. 이러한 설정을 모듈 설정 파일에서 함.
C#이 가진 유연한 기능(compile on-the-fly. 실행 중에 코드를 바로 컴파일하고 그 결과를 반영)을 활용해 런타임에 cs 파일을 읽어 빌드 환경을 구축하고 컴파일을 진행함
게임 프로젝트의 소스
내가 만든 소스가 게임 프로젝트의 C++ 모듈이 되기 위해 필요한 것
모듈(Module)을 구현한 헤더와 소스 파일이 있어야 함.
- 주로 {모듈 이름}.h와 {모듈 이름}.cpp로 지정함.
모듈의 뼈대를 제작
- 매크로를 통해 기본 뼈대 구조를 제작
- IMPLEMENT_MODULE: 일반 모듈
- IMPLEMENT_GAME_MODULE: 게임 모듈
- IMPLEMENT_PRIMARY_GAME_MODULE: 주 게임 모듈
- 게임을 제작하는데 있어서 가장 중심이 되는, 전체적인 게임을 동작하는데 사용하는 로직들을 모아둔 모듈
일반적으로 게임 프로젝트는 주 게임 모듈을 하나 선언해야 함.
모든 준비가 완료되면 .uproject를 우클릭해서 Generate Visual Studio project files. 메뉴를 선택. Intermediate 폴더에 프로젝트 관련 파일이 자동으로 생성됨.
Source 폴더를 규칙에 맞게 구성하면 Intermediate 폴더는 언제든지 재생성이 가능함.
실습 예제
직접 Source 폴더를 생성해서 수동으로 모듈 추가
복사했던 Binaries 폴더 삭제
.uproject의 모듈 이름을 UnrealBuildSystem으로 변경
Source 폴더를 추가하고 그 안에 모듈 폴더 추가
Source 폴더 안에는 타겟을 지정하는 Target.cs 파일이 들어가야 하고, 모듈 폴더 안에는 모듈에 대한 빌드 설정을 진행할 Build.cs 파일이 들어가야 함.
우선 에디터에 관련된 Target.cs 생성. {프로젝트이름}Editor.Target.cs
Target.cs 파일은 프로젝트 단위로 관리되기 때문에 프로젝트에 단 하나만 존재함.
Target.cs 파일 작성
// Copyright Epic Games, Inc. All Rights Reserved.
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");
}
}
UnrealBuildSystemEditor.Target.cs
클래스 이름은 UnrealBuildSystemEditorTarget라는 규칙에 맞춰 지정
Type 정보에는 Editor라고 명시해줘야함.
Type = TargetType.Editor
모듈 폴더 안에는 UnrealBuildSystem이라는 모듈 이름에 관련된 설정 파일을 추가. {모듈 이름}.Build.cs
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 uproject file with the Enabled attribute set to true
}
}
UnrealBuildSystem.Build.cs
UnrealBuildTool 헤더를 참조하고 있는 C# 코드이며 규칙에 맞춰 모듈 이름을 클래스로 지정, 클래스의 생성자에 모듈이 사용하고 있는 여러가지 설정들을 지정할 수 있음.
기본적으로 우리가 사용할 코드는 게임에 관련된 코드이기 때문에 언리얼 엔진이 제공하는 기본 기능들을 사용해줘야 함.
"Core", "CoreUObject", "Engine", "InputCore"가 언리얼 엔진이 제공하는 대표적인 기본 모듈이며 게임 제작 과정에서 거의 필수로 사용함.
모듈 폴더에 모듈 이름으로 된 .h 파일과 .cpp 파일도 추가.
프로젝트 루트로 돌아가서 .uproject에 우클릭 후 Generate Visual Studio project files 클릭
UnrealBuildTool에 의해 소스 코드 내 구조를 분석하고 관련된 VS 프로젝트를 Intermediate 폴더에 생성함. 이것들을 총괄하는 솔루션 파일은 루트에 생성됨.
솔루션 파일을 더블클릭해 프로젝트를 열고 모듈 폴더에 생성했던 비어있는 .h 파일과 .cpp 파일 작성
#pragma once
#include "CoreMinimal.h"
.h 파일에는 기본적인 pragma once와 헤더 추가
#include "UnrealBuildSystem.h"
#include "Modules/ModuleManager.h"
// 모듈의 뼈대를 구축할 클래스
// 주 게임 모듈
// IMPLEMENT_PRIMARY_GAME_MODULE에 모듈을 구현한 클래스를 지정해줘야 하는데
// 언리얼 엔진에서 이미 만들어놓은 게임 클래스가 있음.
// FDefaultGameModuleImpl: 언리얼 엔진이 제공하는 게임 모듈 기본 클래스
// IMPLEMENT_PRIMARY_GAME_MODULE(모듈 클래스, 모듈 이름, 게임 이름)
IMPLEMENT_PRIMARY_GAME_MODULE(FDefaultGameModuleImpl, UnrealBuildSystem, "UnrealBuildSystem");
// 위와 같이 지정해주면 이 모듈은 게임에 관련된 핵심적인 기능을 담당하는 C++ 모듈이 됨.
.cpp 파일에는 모듈의 전체적으로 뼈대를 구성하는 클래스를 지정해서 이것이 모듈임을 지정해야함. 매크로를 사용해서 지정.
작성이 완료되면 ctrl+F5를 눌러 모듈이 탑재된 에디터를 실행.
uproject 명세서에 UnrealBuildSystem 모듈을 명시했기 때문에 언리얼 에디터는 UnrealBuildSystem이라는 모듈을 탑재한 상태에서 실행이 됨.
하지만 Content Browser에서 모듈이 보이지는 않는데, 모듈에 아무런 언리얼 오브젝트가 없으면 에디터에서 표시하지 않도록 설계되어 있음.
언리얼 오브젝트를 상속받은 Student를 UnrealBuildSystem 모듈 안에 생성
컴파일이 완료되며 C++ Classes라는 폴더가 생겼고 UnrealBuildSystem이라는 모듈 안에 Student라는 언리얼 오브젝트가 추가됨
VS 파일도 정상적으로 열림.
언리얼 엔진에서 게임을 구성하는 주 모듈을 직접 수동으로 추가 완료.
모듈 간의 종속 관계
언리얼 엔진의 소스는 결국 수많은 모듈의 집합.
모듈 사이에 종속 관계를 설정해 다양한 기능을 구현할 수 있다.
우리가 만드는 게임 모듈도 언리얼 엔진이 만든 모듈을 활용해야 한다.
언리얼 엔진이 제공하는 모듈 사이에도 종속 관계가 있음.
새로운 모듈의 추가
하나의 모듈에 너무 많은 코드가 들어가면 언리얼 엔진은 빌드 방식을 변경함.
프로젝트가 커질수록 모듈을 나누어서 관리하는 것이 유리.
언리얼 엔진은 하나의 프로젝트에 여러 개의 게임 모듈을 둘 수 있도록 설계되어 있음.
모듈의 공개와 참조
주 게임 모듈과 서브 모듈이 있다고 했을 때 주 게임 모듈은 서브 모듈이 제공하는 기능에 의존하게 됨.
그러나 서브 모듈이 가진 모든 기능을 참조하기 보다는 필요한 부분에 대해서만 참조하도록 설계하는 것이 좋음.
모듈 내 소스를 필요한 만큼만 공개해야 모듈 간 의존성을 줄여 변경 사항에 유연하게 대처할 수 있고, 컴파일 타임을 최소화 할 수 있음.
이를 위해 언리얼은 두 개의 폴더 규칙을 만듦.
- 공개할 파일은 모두 Public 폴더로.
- 예외) 예전 언리얼 엔진은 Classes 폴더가 있어 Public 폴더 역할을 하면서 언리얼 오브젝트를 관리했음.
- 숨길 파일은 모두 Private 폴더로.
외부로 공개할 클래스 선언에는 {모듈 이름}_DLL 매크로를 붙일 것.
외부로 공개할 클래스나 함수에는 {모듈 이름}_API 매크로를 붙여 해당 클래스나 함수를 다른 모듈에 노출할지 추가로 지정해줘야함.
서브 모듈에 대한 설정을 완료하고 주 게임 모듈의 Build.cs 설정에 서브 모듈의 이름만 넣어주면 Public 폴더에 Include 디렉토리와 라이브러리를 링크할 수 있도록 UnrealBuildTool이 자동으로 설정해줌.
언리얼 엔진의 소스 코드 구조
VS에서 Engine 아래의 Source 폴더를 보면 Target.cs 파일과 그 외의 많은 폴더들이 있음. 이것들이 모두 모듈을 의미하는 것은 아님.
모듈이 반드시 Target 파일 아래에 있어야할 필요는 없음. 다만 모듈을 시작할 때는 항상 모듈.Build.cs파일이 있으면 됨.
위의 폴더들은 모듈들이 들어가 있는 것을 묶은 대표 폴더. 모듈이 너무 많으니 모듈의 성격에 따라 다시 폴더를 만들어놓았다.
가장 많이 사용되는 것은 Runtime 모듈.
Runtime 모듈 파일 안에는 굉장히 많은 모듈들이 폴더로 들어가 있는데 그 중 Core 모듈도 있음.
Core모듈에 들어가보면 모듈 안에 {모듈이름}.Build.cs 파일이 들어있다.
항상 Build.cs 파일이 있는 곳이 모듈이 시작되는 곳이라고 생각하면 됨.
모듈 폴더 안에는 Public 폴더와 Private 폴더가 있으며 Public 폴더 안에는 또 다시 외부로 노출되는 굉장히 많은 헤더 파일들이 선언되어 있음.
엔진 모듈은 Runtime 안의 Engine에 있음.
Classes 폴더가 있는데 Public 폴더와 동일한 역할을 함.
이전 버전의 언리얼 엔진은 Classes 폴더에 언리얼 오브젝트를 관리하도록 되어 있었기 때문에 이러한 것들이 남아있음. 지금은 신경쓰지 않고 Public 폴더에 넣으면 됨.
플러그인 시스템
게임 프로젝트 소스에 모듈을 추가하는 방법은 분업이 어렵다는 단점이 있음.
공용 기능들은 프로젝트에서 아예 독립시켜 모듈만 스스로 동작하는 플러그인 구조를 만들어 분업화 하는 것이 바람직함.
플러그인 구조
플러그인은 다수의 모듈과 게임 콘텐츠를 포함하는 포장 단위
에디터 설정을 통해 유연하게 플러그인을 추가하거나 삭제할 수 있음
플러그인 구조
- 플러그인 명세서 (uplugin 파일)
- 플러그인 리소스 (Resource 폴더, 에디터 메뉴용 아이콘)
- 콘텐츠
- 모듈 폴더
이러한 플러그인은 마켓 플레이스 판매로도 이어질 수 있도록 여러 설정을 추가할 수 있음.
실습 예제
플러그인 제작
프로젝트 루트에 Plugins라는 폴더를 만들어주면 UnrealBuildTool이 감지해서 안에 있는 소스 코드를 분석하고 프로젝트를 만들 수 있음.
GameUtility라는 플러그인 생성.
플러그인 폴더 안에 플러그인 명세서인 uplugin 파일을 만듦.
{
"FileVersion": 3,
"Version": 1,
"VersionName": "1.0",
"FriendlyName": "GameUtility",
"Modules": [
{
"Name": "CommonUtility",
"Type": "Runtime",
"LoadingPhase": "Default"
}
]
}
플러그인 내부 구조
플러그인 명세서에는 플러그인에 대한 버전 정보와 이름, Modules에 대한 정보를 입력.
모듈에 대한 객체를 넣어주고 모듈의 이름과 타입, 로딩 시점을 지정
LoadingPhase를 기본으로 지정해 게임 모듈과 같은 타이밍에 로딩되도록 함.
플러그인을 만들 때 수동으로 입력해야하는 것은 아니고 에디터 메뉴에서 추가할 수 있음.
모듈이 들어갈 Source 폴더 생성
Build.cs 파일과 .h, .cpp 파일 추가.
// Copyright Epic Games, Inc. All Rights Reserved.
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
}
}
Build.cs 파일에 내용 입력해주고 클래스 명만 CommonUtility로 변경
기본 뼈대가 완성되었고 모듈 추가할 때와 똑같이 루프 폴더에서 VS 프로젝트 파일 생성해주면 됨.
솔루션 파일을 실행하면 Plugins 파일이 잘 추가되었음.
#pragma once
#include "CoreMinimal.h"
헤더 파일에 헤더 추가
#include "CommonUtility.h"
#include "Modules/ModuleManager.h"
// 모듈의 뼈대를 구성하는 매크로
// 공용 기능이기 때문에 기본 모듈
IMPLEMENT_MODULE(FDefaultModuleImpl, CommonUtility);
.cpp 파일
빌드 후 에디터에서 언리얼 오브젝트 추가
주 게임 모듈이 아닌 CommonUtility 모듈로 지정
Person 오브젝트와 Person에 대한 주요 기능을 내부에서 구현하는 클래스라고 가정한 PersonImpl 오브젝트 생성
Plugins 폴더 안에 Public과 Private 폴더를 만든 후 Person.h과 CommonUtility.h만 Public에 넣어 공개하고 나머지는 Private으로 이동
CommonUtility를 참고하는 다른 모듈들은 오로지 PersonUObject만 사용할 수 있게 됨.
폴더 구조를 변경했으니 루트 폴더에서 솔루션 재생성.
재생성 하면 폴더 구조가 변경됨.
PersonImpl이라는 클래스는 현재 내부에서만 사용하기 때문에 외부로 노출할 필요가 없음.
모듈이름_API로 되어 있는 매크로를 삭제해서 안전하게 외부 모듈이 참조할 수 없도록 지정하는 것이 좋음.
공용 모듈에 대한 기본적인 설계가 완료됨.
이제 주 게임 모듈이 Plugins에 있는 CommonUtility를 참조할 수 있도록 모듈 간의 의존성을 설계.
UnrealBuildSystem.Build.cs에 “CommonUtility” 추가.
주 게임 모듈은 종착지. 주 게임 모듈을 참조하는 다른 모듈이 있는 것은 설계에 좋지 않음.
그렇기 때문에 주 게임 모듈 안에서 Public이나 Private이냐를 나누는 것은 크게 의미가 없음.
Build.cs에 CommonUtility 모듈을 지정하게 되면 Public 폴더의 위치를 자동으로 참조하고 여기서 만들어진 라이브러리들을 자동으로 링크해서 사용할 수 있음.
설정이 완료되었으니 Student 클래스로 가서 Person.h를 마치 현재 폴더에 있는 것처럼 사용하면 됨.
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "UObject/NoExportTypes.h"
#include "Person.h"
#include "Student.generated.h"
/**
*
*/
UCLASS()
class UNREALBUILDSYSTEM_API UStudent : public UPerson
{
GENERATED_BODY()
};
Student.h
빌드 후 실행한 뒤 Content Browser의 설정에서 Show Plugin Content 옵션을 켜주면
플러그인 폴더와 CommonUtility모듈의 Private과 Public에 대한 언리얼 오브젝트를 확인할 수 있다.
이런 플러그인들은 Edit의 Plugins에서 자유롭게 추가하거나 삭제할 수 있다.
게임 빌드
모든 게임 제작이 완료된 후 사용자에게 배포할 게임 프로그램이 만들어지기 위해서는 DLL 파일이 아닌 실행 파일이 만들어져야 함.
에디터에 관련된 빌드 설정이 아닌 실행 파일을 만들기 위한 게임 빌드 설정
게임 타겟 설정을 추가하면 게임 빌드 옵션이 추가됨.
게임 타겟으로 빌드된 모듈은 정적 라이브러리로 실행 파일에 포함됨.
게임이 실행되기 위해서는 실행 파일과 콘텐츠 애셋이 함께 있어야 함.
빌드 : 실행 파일을 생성하기 위한 컴파일
쿠킹 : 지정한 플랫폼에 맞춰 콘텐츠 애셋을 변환하는 작업
패키징 : 이들을 모두 모아서 하나의 프로그램으로 만드는 작업
실습 예제
프로젝트의 게임 빌드 타겟의 추가하고 직접 게임 빌드 수행
에디터의 Source 폴더에 Target 파일 생성
일반적으로 {프로젝트 이름}.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");
}
}
Target 파일
UnrealBuildSystemTarget 이름에 맞춰서 클래스 이름과 생성자를 지정해주고 Type 정보에 Game으로 지정
Type = TargetType.Game;
게임 타겟을 지정해 주지 않아서 현재 빌드 설정에는 2가지 에디터밖에 없음
프로젝트 루트에서 UnrealBuildTool을 가동해 프로젝트 재생성해주면
빌드 타겟이 에디터가 아닌 세 가지가 늘어남
Shipping 빌드가 사용자에게 배포할 최종 게임의 코드를 만들어내는 작업
이때는 모든 코드들이 최적화되어 들어감.
check()나 ensure()같은 어썰션 매크로들은 빌드에서 제외됨.
Shipping을 선택하고 빌드하면 결과물이 exe 파일로 생성됨
Binaries 폴더에 exe 파일이 있음.
실행시켜보면 언리얼 에디터 로고가 떴다가 바로 Missing game files라는 에러 다이얼로그가 뜸
게임 실행 파일은 만들었지만 게임에 필요한 애셋이 없어서 프로그램을 실행할 수가 없다는 뜻
그래서 게임 애셋들을 대상 플랫폼으로 튜닝해서 묶어둔 모음들이 필요.
이것을 쿠킹이라고 하며 에디터에서 진행할 수 있음.
다시 빌드 설정을 Development Editor로 바꿔주고 에디터 실행
에디터에 쿠킹과 빌드를 동시에 수행해 줄 윈도우 플랫폼을 대상으로 패키징을 진행하는 메뉴가 있음.
옵션을 Shipping으로 지정하고 Package Project 메뉴를 선택하면 쿠킹과 빌드를 동시에 수행해줌
저장할 Package 폴더를 만들어주고 선택하면 자동으로 패키징이 진행됨.
Output Log로 진행 상황을 확인할 수 있고 처음 패키징 할때는 굉장히 오래걸림.
패키징이 완료되면 패키지 폴더 안에 플랫폼 이름으로 된 폴더가 있고 그 안에는 UnrealBuildSystem이라는 프로젝트 이름으로 된 exe 파일이 있음
UnrealBuildSystem 폴더 안의 Binaries/Win64 폴더를 보면 VS에서 Shipping 했을 때 봤던 exe 파일이 들어있음
UnrealBuildSystem의 Content 폴더에 여기에 사용되는 애셋들, Engine 폴더 안에 엔진에 관련된 기본 애셋들이 포함되어 전체 패키지를 구성하게 됨.
마지막으로, UnrealBuildSystem.exe 파일을 실행하면 게임이 시작됨.
'게임 개발 > 언리얼 C++' 카테고리의 다른 글
언리얼 C++ - 정적 분기와 동적 로직, 리플렉션의 사용 (0) | 2024.12.18 |
---|---|
언리얼C++ - Delegate를 배열에 저장해서 사용하기 (0) | 2024.12.18 |
언리얼C++ - 언리얼 오브젝트 관리 1 | 직렬화(Serialization) (1) | 2024.11.20 |
언리얼C++ - 언리얼 엔진의 메모리 관리 (0) | 2024.11.19 |
언리얼C++ - 언리얼 컨테이너 라이브러리 2 | 구조체와 Map (0) | 2024.11.18 |