Unreal Engine 모듈 · 플러그인 개발
프로젝트에 붙어 있는 C++ 기능을 빌드·의존성·로드 경계로 분리하고, 다른 프로젝트에서도 활성화·컴파일·실행할 수 있는 Runtime 및 Editor 플러그인으로 완성합니다. 플러그인 생성 마법사보다 Unreal Build Tool의 의존성 그래프와 배포 후 검증을 중심으로 학습합니다.
과정에서 해결하는 문제
기능이 동작해도 게임 모듈의 Character, 프로젝트 Config와 특정 에셋 경로를 직접 참조하면 다른 프로젝트로 옮기는 순간 컴파일이 깨집니다. 반대로 모든 헤더와 의존성을 Public으로 공개하면 빌드 시간이 늘고 구현 세부가 외부 계약이 됩니다. 이 과정은 무엇을 공개 API로 유지하고, 어떤 의존성을 Private으로 숨기며, Runtime과 Editor를 어디서 분리할지를 실제 두 플러그인으로 검증합니다.
모듈은 코드의 빌드·의존성·로드 단위이고, 플러그인은 하나 이상의 모듈과 선택적 Content·Config·Resources를 묶는 활성화 가능한 기능 패키지입니다. 둘을 같은 뜻으로 사용하지 않고, UBT가 만드는 모듈 그래프와 Plugin Descriptor가 정하는 로드 범위를 따로 추적합니다.
선수 지식
- Unreal Engine C++ 기초집 완료 또는 동등한 프로젝트 경험
- C++ 클래스, 헤더와 CPP, 상속, 포인터·참조와 Forward Declaration
UCLASS,USTRUCT,UPROPERTY,UFUNCTION과generated.h기초- Actor, ActorComponent, UObject와 Subsystem의 수명·책임
- Visual Studio 또는 Rider에서 C++ 프로젝트를 생성하고 Development Editor 빌드를 실행한 경험
멀티플레이 지식은 필수가 아닙니다. 상호작용 기능을 네트워크 게임으로 확장하려면 이 과정을 마친 뒤 Unreal Engine 멀티플레이 과정으로 이어갑니다.
권장 학습 환경
- Unreal Engine 5 계열 C++ 프로젝트와 프로젝트가 사용하는 정확한 엔진 버전의 공식 문서
- Visual Studio 2022 또는 Unreal C++를 지원하는 Rider
- Git으로 관리되는 실습 프로젝트와 별도의 빈 C++ 검증 프로젝트
- Editor, Development Editor, Development Game 또는 패키징 빌드를 구분할 수 있는 환경
- 코드 플러그인 두 개를 복사해도 경로가 겹치지 않는 짧은 ASCII 프로젝트 경로
메뉴, UAssetDefinition, Data Validation 함수 시그니처와 빌드 규칙은 UE5 세부 버전에 따라 달라질 수 있습니다. 예제는 UE 5.8 공식 문서를 기준으로 설명하되, 실제 프로젝트 버전의 Engine 헤더와 API Reference를 최종 근거로 사용합니다.
최종 결과물
1. ReusableInteraction Runtime 플러그인
프로젝트 Character를 직접 참조하지 않는 상호작용 인터페이스와 Scanner Component를 제공합니다. Trace 채널·거리·디버그 옵션은 UDeveloperSettings와 Config로 관리하며, Blueprint에는 요청 API와 확장 이벤트만 노출합니다. 서버 권한 프로젝트에서는 호출자가 이 API 위에 권한 검증을 추가할 수 있도록 C++ 경계를 유지합니다.
2. DataGuard Editor 플러그인
ToolMenus와 Dockable Tab에서 검사 범위를 선택하고 Asset Registry로 후보를 모읍니다. UEditorValidatorBase 규칙이 잘못된 이름·누락된 필수 데이터·금지된 참조를 Message Log와 Data Validation 결과로 보고합니다. Editor 모듈만 사용하므로 Shipping 게임에 포함되지 않습니다.
3. 이식·배포 검증 기록
두 플러그인을 원본 프로젝트 밖으로 패키징한 뒤 빈 C++ 프로젝트의 Plugins/에 설치합니다. 원본 게임 모듈 이름이 남지 않았는지 검색하고, 플러그인 활성화, IDE 프로젝트 갱신, Editor 빌드, Runtime 실행, Data Validation과 Development 패키징 결과를 기록합니다.
36강 커리큘럼
| 강의 | 주제 | 누적 결과물 |
|---|---|---|
| 1 | 모듈과 플러그인은 왜 필요한가 | 프로젝트 기능 분리 후보 지도 |
| 2 | Unreal Build Tool과 UnrealHeaderTool의 빌드 흐름 | UBT·UHT 실패 단계 진단표 |
| 3 | Target, Module, Plugin 구조 읽기 | 빌드·로드 구조 트리 |
| 4 | .Build.cs와 모듈 의존성 | 최소 의존성 Build.cs |
| 5 | Public·Private와 헤더 공개 범위 | 공개 API 목록 |
| 6 | API 매크로와 모듈 경계 | 외부 모듈 사용 클래스 |
| 7 | IModuleInterface 수명 | 안전한 등록·해제 모듈 |
| 8 | LoadingPhase 선택 | 로딩 단계 결정 기록 |
| 9 | 새 Runtime 모듈 추가 | 독립 GameplaySupport 모듈 |
| 10 | Runtime·Editor·Developer 분리 | 실행 대상별 모듈 설계 |
| 11 | 순환 의존성·Include 해결 | 비순환 의존성 그래프 |
| 12 | Forward Declaration 실전 | 경량 Public 헤더 |
| 13 | 로그와 빌드·로드 디버깅 | 모듈 전용 로그 카테고리 |
| 14 | .uplugin Descriptor | 두 모듈 플러그인 Descriptor |
| 15 | Content Only와 Code Plugin | 플러그인 유형 선택 기록 |
| 16 | Project와 Engine Plugin | 설치 범위 결정표 |
| 17 | Runtime 플러그인 생성 | ReusableInteraction 뼈대 |
| 18 | Editor 플러그인 생성 | DataGuard 뼈대 |
| 19 | Plugin Module 의존성 | Runtime→Editor 역참조 없는 그래프 |
| 20 | UDeveloperSettings | 상호작용 설정 화면 |
| 21 | Config 범위와 기본값 | 이식 가능한 기본 Config |
| 22 | ToolMenus 명령 | DataGuard 메뉴·툴바 진입점 |
| 23 | Slate Dockable Tab | 검사 결과 탭 |
| 24 | Details Panel 커스터마이징 | 검사 설정 편집 흐름 |
| 25 | Custom Asset·Factory·Asset Definition | 검사 규칙 Asset 생성 경로 |
| 26 | Data Validation | 자동 발견 Validator |
| 27 | Asset Registry 검사 | 비동기 수집 기반 검사 목록 |
| 28 | 상호작용 기능 플러그인 분리 | 프로젝트 의존성 제거 |
| 29 | Blueprint API와 C++ 확장 지점 | 좁은 Blueprint 계약 |
| 30 | 에셋·Content·입력·설정 안전성 | Soft Reference 정책 |
| 31 | 테스트·로그·크래시 추적 | 실패 재현 체크리스트 |
| 32 | 플러그인 패키징·적용 | 배포 폴더와 소비 프로젝트 |
| 33 | 버전 호환성·배포 점검 | 버전·지원 범위 문서 |
| 34 | 실습 1: Runtime 플러그인 | 완성된 ReusableInteraction |
| 35 | 실습 2: Editor 플러그인 | 완성된 DataGuard |
| 36 | 최종 이식·검증 | 빈 프로젝트 검증 보고서 |
공식 문서 기준
COURSE ORIENTATION
과정 선택 안내
- 학습 대상
- Unreal C++ 기초를 모듈 경계와 재사용 가능한 Runtime·Editor 플러그인으로 확장하려는 학습자
- 선수지식
- Unreal Engine C++ 입문, UObject·ActorComponent·Subsystem과 C++ 빌드 기초
- 최종 결과물
- 빈 C++ 프로젝트에서 이식 검증한 Runtime 상호작용·Editor 데이터 검증 플러그인