최종 실습: 빈 C++ 프로젝트에 두 플러그인 이식·검증하기
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,Slatein 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 상호작용 검증
- C++ Pawn 또는 Character에
UInteractionComponent추가 - Enhanced Input에서
TryInteract호출 - C++ Door와 Blueprint Door에
IInteractable구현 - 150cm, 경계 거리, 거리 밖에서 각각 실행
- 장애물 뒤, Actor 파괴 직후, 연속 입력을 시험
- Prompt 변화와 TargetChanged Delegate 확인
- Plugin Content 아이콘 없이도 기능이 정상인지 확인
멀티플레이 환경으로 확장하는 경우 Client 요청만으로 문 상태를 바꾸지 않습니다. 서버가 Target 유효성·거리·시야·Ownership을 확인하고 지속 상태를 Replicated 변수 또는 RepNotify로 전송합니다.
4-5. Editor 데이터 검증 도구 검증
- Data Guard 메뉴와 Dockable Tab 열기
DA_DataGuardRules생성 후/Game/TestAssets와BP_규칙 저장- 올바른
BP_ValidDoor와 잘못된WrongDoor생성 - Tab Scan에서 오류 1건과 경로 확인
- 결과를 선택해 Content Browser 이동 확인
- Content Browser Validate Assets 결과 비교
- Commandlet 실행 후 같은 오류가 로그에 있는지 확인
- 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. 최종 검증 기록
# 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. 핵심 요약
최종 실습: 빈 C++ 프로젝트에 두 플러그인 이식·검증하기 미니 퀴즈
선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.
학습을 마쳤나요?
직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.