본문 바로가기

개발/언리얼

언리얼 모듈과 플러그인?

모듈에 대한 공식 문서

https://dev.epicgames.com/documentation/unreal-engine/gameplay-modules-in-unreal-engine?lang=ko

 

Gameplay Modules in Unreal Engine | Unreal Engine 5.8 Documentation | Epic Developer Community

Collections of gameplay classes belonging to a game project compiled into DLLs.

dev.epicgames.com

 

모듈 생성 가이드

https://dev.epicgames.com/documentation/unreal-engine/how-to-make-a-gameplay-module-in-unreal-engine?lang=ko

 

How To Make a Gameplay Module in Unreal Engine | Unreal Engine 5.8 Documentation | Epic Developer Community

Learn how to create a runtime module for your Unreal Engine game from scratch.

dev.epicgames.com

 

 

플러그인에 대한 공식 문서

https://dev.epicgames.com/documentation/unreal-engine/plugins-in-unreal-engine?application_version=5.5

 

Plugins in Unreal Engine | Unreal Engine 5.5 Documentation | Epic Developer Community

How to create Unreal Engine plugins.

dev.epicgames.com

 

 

모듈Module?

모듈이란 언리얼 엔진에서 프로젝트에 속하는 클래스의 모음, 관련 클래스를 모으는 그릇 등으로 이야기한다.

언리얼 엔진은 그 자체로 수백개의 모듈을 가지고 있으며,
다른 모듈에 대한 의존성 선언을 통해 각 모듈들의 기능을 불러와 사용한다.

 

이는 각 모듈의 build.cs파일에서 정의를 하도록 되어 있으니 살펴보자.

 

모듈 의존성 선언

using UnrealBuildTool;

public class ModuleAndPlugin : ModuleRules
{
	public ModuleAndPlugin(ReadOnlyTargetRules Target) : base(Target)
	{
		PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;

		PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "EnhancedInput"});
	}
}

ModuleAndPlugin은 프로젝트명이고 내부에 PublicDependencyModuleNames 배열이 있음을 볼 수 있는데.

이 배열이 어떤 모듈을 의존(사용)할 것 인지를 정의하는 내용이다.

이전에 프로젝트에 UI를 추가하고 Widget을 C++로 구현하기위해 우리는 "UMG"를 추가했었는데

이게 모듈 의존성 선언을 했던 것이다.

 

주 게임 모듈?

언리얼 프로젝트를 처음 생성시에 프로젝트명으로 폴더와 build.cs 파일이 생성되는것도 하나의 모듈이 같이 생성된것이라 할 수 있다.

다른 모듈과는 조금 다르게 이를 주 게임 모듈이라고 부르는데 이를 구분하는 방법은

모듈 폴더 아래 {프로젝트명}.cpp 폴더에서 사용한 모듈 정의 매크로가 IMPLEMENT_PRIMARY_GAME_MODULE인것으로 확인할 수 있다.

각 프로젝트는 반드시 단 하나의 주 게임모듈을 가지고 있어야 하고, 나머지는 일반 모듈로 생성한다. 

주 게임 모듈이 아닌 모듈은 "IMPLEMENT_MODULE" 매크로를 사용하도록 되어 있으며,

일반 모듈은 코드 생성시 Private/Public 접근제한을 꽤나 엄격히 구분하도록 되어있다.

주 게임 모듈의 build.cs 파일 내부.

 

 

모듈은 각각 독립적인 컴파일 단위로 작동하여,

기능들이 각 모듈로 분리되어있을때 특정 기능 하나를 수정했다면 빌드시 해당 모듈만이 빌드되어 더 효율적인 개발이 가능하며,

이렇게 책임이 분리된 구조는 장기적으로 코드를 더 효율적이고 유지보수 가능한 프로젝트로 만든다.

 

모듈을 분리하고 사용할때는 모듈간의 순환 의존성이 없도록 하고,

가능한 모듈의 Public 의존성을 줄이는 게 좋다

 

헤더에서는 전방선언을 하고, 구현부에서 Include를 하는 이유와 동일한데,

헤더에서 Include해 사용한다면 해당 코드를 사용하는 다른 모듈에 영향이 전파되기 때문.

 

 

플러그인 Plugin?

플러그인은 프로젝트에 기능을 추가하기위한 확장 패키지로, 하나 이상의 모듈을 가지고 있다.

모듈과 다른점은 .uplugin파일을 가지며 이를 통해 플러그인 이름, 설명, 포함 모듈부터 로딩 시점과 사용위치까지 지정가능하다.

 

예를 들어, 디버그를 위해 텍스트 출력 매크로를 선언하고 여기서 NetRole, Authority, 함수명이나 시간등의 출력을 지원하는 플러그인을 만들었다고 하자.

 

해당 플러그인의 .uplugin 파일에서 플러그인이 가진 모듈의 Type을 설정하여 Editor전용으로 만들 수 있다.

플러그인 내 모듈의 Type설정.

이외에도 Runtime전용, Development전용 등 구현한 기능과 용도에 따라 모듈이 로드되는 환경을 제한할 수 있다.

종류는 EHostType에서 정의된다.

 

모듈과 플러그인의 차이

구분 모듈 플러그인
성격 C++ 코드 빌드 단위 기능 확장 패키지
파일 .Build.cs .uplugin
위치 Source/모듈명 Plugins/플러그인명
포함 관계 플러그인 안에 들어갈 수 있음 최소 하나 이상의 모듈을 가질 수 있음
목적 코드 분리, 의존성 관리, 컴파일 단위 관리 기능을 프로젝트/엔진에 추가하거나 재사용