본문으로 건너뛰기
Unreal Engine 모듈 · 플러그인 개발LESSON 36

최종 실습: 빈 C++ 프로젝트에 두 플러그인 이식·검증하기

난이도심화
예상 시간300분
선수지식34~35강의 두 완성 Plugin

36강. 최종 실습: 빈 C++ 프로젝트에 두 플러그인 이식·검증하기

1. 이번 강의에서 해결할 문제​

Plugin 개발의 마지막 실패 지점은 “원본 프로젝트에서는 된다”입니다. 원본 Target, PCH, Config, Content, 이미 활성화된 Plugin이 누락 의존성을 가려 주기 때문입니다. 최종 실습은 두 Plugin을 깨끗한 빈 C++ 프로젝트에 옮기고 활성화 → 컴파일 → Editor 실행 → Runtime 실행 → 자동 검증 → 패키징을 새로 수행합니다.

2. 학습 목표​

3. 핵심 개념​

이식 검증은 복사가 아니라 계약 시험입니다.

Plugin 산출물
↓
빈 C++ 프로젝트/Plugins
↓
Editor Target Build
├─ ReusableInteraction Runtime 기능
└─ DataGuard Editor 도구
↓
Development Game / Package
└─ ReusableInteraction만 포함
↓
Commandlet Data Validation
└─ DataGuard 오류 로그

각 단계는 다음 단계로 넘어가기 위한 별도 증거입니다. Build 성공이 Runtime 상호작용을 증명하지 않고, Editor 실행이 Shipping 경계를 증명하지 않습니다.

4. 단계별 실습​

4-1. 깨끗한 검증 프로젝트 준비​

사용 중인 UE5 버전으로 Blank C++ 프로젝트 EmptyPluginTest를 만듭니다. 원본 게임의 Config나 Source를 복사하지 않습니다.

EmptyPluginTest/
├─ Config/
├─ Content/
├─ Plugins/
│ ├─ ReusableInteraction/
│ └─ DataGuard/
├─ Source/EmptyPluginTest/
└─ EmptyPluginTest.uproject

배포 산출물에서 Intermediate, Saved, 원본 프로젝트의 Binaries를 제외합니다. Source 배포라면 수신 엔진으로 새로 빌드합니다.

4-2. 정적 독립성 감사​

다음 항목을 검색하고 결과를 저장합니다.

  • 원본 프로젝트 Module·GameMode·Character 이름: 0건
  • UnrealEd, ToolMenus, Slate in ReusableInteraction Runtime: 0건
  • DataGuardEditor 참조 in ReusableInteraction: 0건
  • Public Header의 불필요한 Engine Header: 검토 완료
  • Descriptor Module 이름과 Source 폴더·Build.cs 클래스명: 전부 일치

4-3. Editor Target 활성화·컴파일​

Project Files를 갱신하고 Development Editor Target을 전체 빌드합니다. 실패하면 마지막 오류가 아니라 첫 UHT·Compile·Link 오류부터 고칩니다.

Editor 실행 뒤 다음 로그를 구분합니다.

LogPluginManager: Mounting Engine plugin ...
LogReusableInteraction: ReusableInteraction started
LogDataGuardEditor: DataGuardEditor started

실제 로그 문구는 구현과 엔진 버전에 따라 달라질 수 있습니다. Module 이름, 활성화 상태, LoadingPhase를 확인할 수 있는 고유 카테고리를 사용합니다.

4-4. Runtime 상호작용 검증​

  1. C++ Pawn 또는 Character에 UInteractionComponent 추가
  2. Enhanced Input에서 TryInteract 호출
  3. C++ Door와 Blueprint Door에 IInteractable 구현
  4. 150cm, 경계 거리, 거리 밖에서 각각 실행
  5. 장애물 뒤, Actor 파괴 직후, 연속 입력을 시험
  6. Prompt 변화와 TargetChanged Delegate 확인
  7. Plugin Content 아이콘 없이도 기능이 정상인지 확인

멀티플레이 환경으로 확장하는 경우 Client 요청만으로 문 상태를 바꾸지 않습니다. 서버가 Target 유효성·거리·시야·Ownership을 확인하고 지속 상태를 Replicated 변수 또는 RepNotify로 전송합니다.

4-5. Editor 데이터 검증 도구 검증​

  1. Data Guard 메뉴와 Dockable Tab 열기
  2. DA_DataGuardRules 생성 후 /Game/TestAssets와 BP_ 규칙 저장
  3. 올바른 BP_ValidDoor와 잘못된 WrongDoor 생성
  4. Tab Scan에서 오류 1건과 경로 확인
  5. 결과를 선택해 Content Browser 이동 확인
  6. Content Browser Validate Assets 결과 비교
  7. Commandlet 실행 후 같은 오류가 로그에 있는지 확인
  8. DataGuard 비활성화 뒤 게임 Asset이 그대로 열리는지 확인

4-6. Game·Shipping 경계 검증​

Development Game Target을 빌드하고 Module 목록에 DataGuardEditor가 없는지 확인합니다. 그다음 빈 맵을 Development Package로 만들고 실행합니다.

검증 항목은 다음과 같습니다.

  • ReusableInteraction Module Load 성공
  • 상호작용 기능 실행 성공
  • UnrealEd 또는 DataGuardEditor Missing Import 없음
  • Config 기본값 적용
  • 선택 Plugin Content Mount 성공 또는 안전한 미사용 처리
  • 종료 시 Crash 없음

Shipping은 로그 수준과 개발용 기능이 다르므로 Development 성공만으로 대체하지 않습니다. 실제 배포 목표가 Shipping이면 Shipping Package도 별도로 검증합니다.

4-7. 최종 검증 기록​

Verification/EmptyPluginTest-UE5.x.md 예시
# EmptyPluginTest verification

- Engine: 실제 UE 버전과 빌드 출처
- Platform: Win64
- ReusableInteraction: 1.0.0
- DataGuard: 1.0.0

## Results
- [x] Development Editor clean build
- [x] Runtime C++ and Blueprint interaction
- [x] Data Guard tab and asset navigation
- [x] DataValidation commandlet
- [x] Development Game build without editor module
- [x] Development package launch and shutdown
- [ ] Shipping package: 미실행이면 이유와 제한을 명시

## Evidence
- Build logs
- Validation log
- Package launch log
- Test map screenshot

## Known limits
- 검증하지 않은 Engine·Platform 조합
- 선택적 Plugin Content 정책
- 멀티플레이 서버 권한 Adapter는 별도 프로젝트 책임

실행하지 않은 항목은 체크하지 않고 제한으로 남깁니다. 이것이 이식 가능성을 과장하지 않는 배포 기록입니다.

5. 코드가 동작하는 이유​

빈 프로젝트는 원본 프로젝트의 우연한 의존성을 제거합니다. Editor·Game·Package·Commandlet을 분리해 검증하면 Runtime Module과 Editor Module의 Target 경계, Config와 Content의 배포, 실제 기능의 실행을 각각 증명할 수 있습니다.

6. 자주 하는 실수와 해결법​

7. 직접 실습​

8. 이해 점검 질문 3개​

9. 핵심 요약​

MINI QUIZ

최종 실습: 빈 C++ 프로젝트에 두 플러그인 이식·검증하기 미니 퀴즈

선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.

0 / 2
  1. 문제 1“최종 실습: 빈 C++ 프로젝트에 두 플러그인 이식·검증하기” 실습을 안전하게 진행하기 위한 판단으로 가장 알맞은 것은 무엇인가요?
  2. 문제 2“최종 실습: 빈 C++ 프로젝트에 두 플러그인 이식·검증하기” 실습 중 ‘DataGuard가 꺼지면 Runtime Asset이 깨짐’ 상황을 발견했습니다. 본문과 일치하는 설명은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.

36강. 최종 실습: 빈 C++ 프로젝트에 두 플러그인 이식·검증하기 미완료 상태