모듈과 플러그인은 왜 필요한가
1강. 모듈과 플러그인은 왜 필요한가
1. 이번 강의에서 해결할 문제
상호작용 Trace가 Character 안에서만 동작하고, 데이터 검사 메뉴가 게임 모듈의 Editor 조건부 코드에 섞여 있습니다. 이 기능을 다른 프로젝트로 복사하면 원본 Character와 에셋 경로를 찾지 못하고, Shipping 패키징에서는 UnrealEd Symbol 오류가 발생합니다. 파일을 폴더로 나누는 것만으로는 빌드와 로드 경계가 생기지 않습니다.
2. 학습 목표
3. 핵심 개념
모듈은 코드의 빌드·의존성·로드 단위입니다. 각 모듈은 .Build.cs, Source와 Module 구현을 갖고 UBT가 별도 컴파일 단위로 처리합니다. 플러그인은 하나 이상의 모듈과 선택적 Content·Config·Resources를 묶는 기능 패키지입니다. 플러그인을 켜고 끄는 것과 모듈 사이 C++ 의존성을 선언하는 것은 연결되지만 같은 작업은 아닙니다.
재사용 후보는 “두 프로젝트에서 쓸 것 같은 코드”보다 상위 프로젝트 규칙을 몰라도 계약을 설명할 수 있는 기능입니다. 상호작용 Component는 IInteractable 계약만 알면 재사용할 수 있지만, 특정 게임의 QuestManager와 PlayerCharacter를 직접 호출하면 프로젝트 기능입니다.
GameProject ───────▶ ReusableInteraction(Runtime)
DataGuard(Editor) ─▶ AssetRegistry / DataValidation
금지: ReusableInteraction ─▶ GameProject
금지: ReusableInteraction ─▶ UnrealEd / DataGuard
4. 단계별 실습
현재 프로젝트의 기능을 다음 표로 분류합니다.
| 기능 | 권장 위치 | 판단 근거 |
|---|---|---|
| 캐릭터가 퀘스트를 완료했는지 판정 | 게임 모듈 | 프로젝트 규칙과 저장 데이터에 강하게 결합 |
| 전방 대상 탐색과 상호작용 계약 | Runtime 플러그인 | Actor 종류와 게임 규칙을 몰라도 제공 가능 |
| 에셋 이름·필수 필드 검사 | Editor 플러그인 | 제작 도구이며 Shipping 실행에 불필요 |
| 점령 포인트 승리 판정 | 게임 또는 멀티플레이 모듈 | 해당 게임의 점수 규칙 |
잘못된 경계
#include "MyGame/Characters/MyPlayerCharacter.h"
#include "MyGame/Quest/MyQuestSubsystem.h"
void UInteractionComponent::Interact()
{
CastChecked<AMyPlayerCharacter>(GetOwner())
->GetGameInstance()->GetSubsystem<UMyQuestSubsystem>()->AdvanceQuest();
}
개선된 계약
UINTERFACE(BlueprintType)
class REUSABLEINTERACTION_API UInteractable : public UInterface
{
GENERATED_BODY()
};
class REUSABLEINTERACTION_API IInteractable
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category="Interaction")
bool CanInteract(AActor* InstigatorActor) const;
UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category="Interaction")
void Interact(AActor* InstigatorActor);
};
플러그인은 요청과 확장 지점만 제공하고 퀘스트 갱신은 소비 프로젝트가 인터페이스 구현에서 처리합니다.
5. 코드가 동작하는 이유
의존성이 GameProject → Plugin 한 방향이면 플러그인은 프로젝트 이름 없이 독립 컴파일할 수 있습니다. REUSABLEINTERACTION_API가 공개 계약을 모듈 경계 밖으로 노출하고, BlueprintNativeEvent는 Blueprint 기본 구현과 C++ override를 모두 허용합니다. 다만 호출 허용 여부와 권한 판정은 C++ 소비 계층이 최종 책임집니다.
6. 자주 하는 실수와 해결법
7. 직접 실습
8. 이해 점검 질문 3개
9. 핵심 요약
모듈과 플러그인은 왜 필요한가 미니 퀴즈
선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.
학습을 마쳤나요?
직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.