2 분 소요

Unreal의 구성 요소

Image

언리얼은 ‘모듈’, ‘플러그인’, ‘프로젝트’라는
계층적인 구성 요소를 가지며
이들은 각각 다른 목적을 지니고 있다

Project (MyRPG)
 ├─ Module (CoreGameplay)
 ├─ Module (UI)
 ├─ Plugin (MyDungeonGen)
 │    └─ Module (DungeonRuntime)
 │    └─ Module (DungeonEditor)
 └─ Plugin (Niagara)

Module

UE4/5 의 빌드 단위이다
(.CPP와 .H를 포함하는 단위)

*.Bulid.cs 파일로 정의되며
특정한 ‘기능적 집합’으로 묶어둔 것
(렌더링, AI, Network 등)

보통 게임을 만들게 되면 하나가 생긴다

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

#include "Samples.h"

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

class SamplesModule : public FDefaultGameModuleImpl
{
	// 모듈 : h + cpp 로 이루어진 최소한의 기능
	// 플러그인 : 다양한 실험적, 외부 기능 (모듈을 여러개 포함할 수 있음)
	// 프로젝트 : 모듈 + 플러그인 으로 이루어지는 전체 구조
public:
	virtual void StartupModule() override;
	virtual void ShutdownModule() override;
};

void SamplesModule::StartupModule()
{
	FDefaultGameModuleImpl::StartupModule();

	UE_LOG(LogSample, Warning, TEXT("StartUpModule!"));
}

void SamplesModule::ShutdownModule()
{
	FDefaultGameModuleImpl::ShutdownModule();
}

// IMPLEMENT_PRIMARY_GAME_MODULE 은 해당 엔진 내에서 하나만 존재해야 함 -> 핵심이 되는 모듈에게만 사용할것
// 모듈마다 이러한 IMPLEMENT 시리즈를 하나씩은 설정해 줘야 함
IMPLEMENT_PRIMARY_GAME_MODULE(SamplesModule, Samples, "Samples" );
  • IMPLEMENT_PRIMARY_GAME_MODULE
    해당 게임의 메인 모듈을 등록하는 매크로
    (프로그램 진입점을 정하듯, 해당 게임 프로젝트의 메인이 될 모듈 설정)
    (메인 엔트리 지점을 설정 - C++ 의 int main()과 비슷하다)
언리얼의 간략한 실행 흐름

[OS] 
   ↓
 WinMain()   ← (플랫폼별 진입점, 유저가 안 건드려도 됨)
   ↓
 GuardedMain()
   ↓
 LaunchEngineLoop("Samples")
   ↓
 Load Module: "Samples"
   ↓
 ┌─────────────────────────────┐
 │ SamplesModule (Primary)     │
 │   ├─ StartupModule()        │
 │   └─ ShutdownModule()       │
 └─────────────────────────────┘
   ↓
 GameInstance / World / GameMode 초기화
   ↓
 [게임 루프 시작!]

  • 보통 하나의 프로젝트(.uproject)에서 메인 모듈(Primary)은 하나
    (즉 위 매크로를 2번 설정하면 빌드 중에 에러가 발생한다)
    (컴파일 에러가 아니므로 찾기 힘들어진다…)
    (반드시 하나는 설정해야 함)

  • 엔진이 ‘게임 루프’를 돌리기 전에
    ‘내 프로젝트’가 무엇인지를 알아야 하기에 설정해야 한다
    (위의 모듈 클래스가 딱히 하는것은 없어보이지만… 꼭 있어야 함)
    (기본적으로 프로젝트 만들때, 알아서 설정해줌)
    (‘커스텀’이 가능한 정도만 알고 있자)

  • 그 외의 모듈 등록은
    IMPLEMENT_MODULE 을 사용하여 일반 모듈을 등록

Build.cs
(해당 프로젝트에 사용할 모듈 이름들을 추가)

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

using UnrealBuildTool;

public class Samples : ModuleRules
{
	public Samples(ReadOnlyTargetRules Target) : base(Target)
	{
		PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
	
		PublicDependencyModuleNames.AddRange(new string[] {
            "Core",
            "CoreUObject",
            "Engine",
            // GAS
            "GameplayTags",
            "GameplayTasks",
            "GameplayAbilities",
            // Game Features
            "ModularGameplay",
            "GameFeatures",
            "ModularGameplayActors",
			//Input
            "InputCore",
            "EnhancedInput",
			// CommonUser
			"CommonUser",
			// CommonGame
			"CommonGame",
			// CommonUI
			"CommonUI",
			// UMG
			"UMG",
			// UIExtension
			"UIExtension",
			// Slate
			"Slate",
			"SlateCore",
        });

		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
	}
}
  • 프로젝트나 플러그인은 ‘여러 모듈’을 둘 수 있음
  • 각각의 모듈마다 public, private 폴더를 통해
    외부 접근 코드와 내부 코드를 분류하는 방식
  • 독립적인 빌드/링킹의 단위이기에 ‘불필요’한 모듈은
    빌드하지 않음
    (Build.cs는 ‘해당 프로젝트’에서 필요한 ‘모듈’만 빌드하면
    된다)

Plugin

하나 이상의 모듈을 담는 ‘기능적 패키지’
프로젝트 외부에서도 쉽게 재사용이 가능하다
(ex : 마켓 플레이스의 플러그인 기능들)

  • *.uplugin 파일의 존재(플러그인 메타 데이터)
  • Plugins 폴더에 넣으면 프로젝트 단위에서 활성화/비활성화 가능
    (플러그인을 만드는 경우, 해당 프로젝트의 Plugins 폴더 내에 생성된다
    그리고 에디터에서 활성화/비활성화가 가능해짐)

  • Niagara, Paper2D 등의 플러그인이 대표적

Project

게임 전체를 포함하는 최상위의 단위
*.uproject 파일이 메타데이터의 역할

컨텐츠, 설정, 소스 코드와 플러그인을 모두 포함

  • 실행 가능한 게임 = 프로젝트 라 인식
  • 여러 모듈과 플러그인을 포함
  • 최종적인 ‘빌드 타겟’도 프로젝트 단위로 결정됨

정리용 계층 표

언리얼 엔진 플랫폼
└── Project (최상위 단위, 게임/앱)
     ├─ Module (코드 묶음)
     ├─ Plugin (재사용 가능한 확장 기능)
     │    └─ Module (여러 개 가능)
     └─ Content/Config (에셋, 설정 등)

댓글남기기