게임 피처(Game Features) 및 모듈형 게임플레이(Modular Gameplay) 플러그인은 개발자가 프로젝트에 사용할 독립형 피처를 구축하도록 도와줍니다. 이러한 플러그인으로 피처를 구축하면 프로젝트의 코드베이스를 깔끔하고 읽기 쉽게 유지하고, 관련 없는 피처 간의 의도치 않은 인터랙션이나 종속성을 방지하는 등 여러 가지 장점이 있습니다. 이러한 장점은 시간이 지나면서 점차 피처 세트를 변경할 라이브 제품을 개발할 때 특히 중요합니다.
초기 설정
다음 단계를 따르면 프로젝트가 독립형 플러그인 기반 피처를 하나 이상 추가할 수 있는 상태로 됩니다.
-
이것이 프로젝트에 추가하는 첫 번째 피처라면, 먼저 게임 피처 및 모듈형 게임플레이 플러그인을 활성화해야 합니다. 플러그인을 활성화하려면, 언리얼 엔진 5(UE5) 메인 에디터 창의 편집(Edit) 드롭다운 메뉴로 이동해 플러그인(Plugins) 을 선택합니다. 플러그인(Plugins) 창이 열리면, 게임 피처(Game Features) 플러그인과 모듈형 게임플레이(Modular Gameplay) 플러그인을 찾아서 활성화합니다. 왼쪽 패널의 게임플레이(Gameplay) 카테고리에서 두 플러그인을 모두 찾을 수 있습니다.
-
이 두 플러그인을 활성화하면 에디터를 재시작하라는 메시지가 표시됩니다. 에디터를 재시작하기 전에 추가(Add) 버튼을 클릭합니다.
-
추가를 클릭하면 새 플러그인(New Plugin) 창이 실행됩니다. 빌드할 기능이 포함될 새 플러그인을 생성해야 합니다. 이 플러그인은 특정한 유형일 필요가 없습니다. 이 예시의 경우, 콘텐츠 전용(Content Only) 타입을 선택했으며 플러그인 이름은
MyStandaloneFeature로 지정했습니다. -
플러그인은 프로젝트 내
/Plugins/GameFeatures/디렉터리에 저장해야 합니다. -
플러그인(Plugins) 창의 지금 재시작(Restart Now) 버튼을 클릭하거나 에디터를 닫고 다시 열어 에디터를 재시작합니다.
-
재시작 시 메시지 로그(Message Log) 의 로드 오류(Load Errors) 카테고리 내에 다음과 같은 텍스트가 표시될 수 있습니다.
'에셋 매니저(Asset Manager) 세팅에 게임 피처 플러그인 작동에 필요한 GameFeatureData 유형의 에셋 항목이 포함되어 있지 않습니다. 스캔할 프라이머리 에셋 타입에 항목을 추가할까요?
- 이 텍스트가 보이면 스캔할 프라이머리 에셋 타입에 항목을 추가할까요?(Add entry to PrimaryAssetTypesToScan?) 를 클릭하여 문제를 해결합니다. 에디터가
DefaultEngine.ini파일을 적절하게 변경하고, 이후로는 해당 메시지가 표시되지 않습니다.
아니면 편집(Edit) 드롭다운 메뉴에서 프로젝트 세팅(Project Settings) 을 선택한 다음 게임(Game) 섹션 아래의 에셋 매니저(Asset Manager) 카테고리로 이동하여 프라이머리 에셋 타입(Primary Asset Type) 을 수동으로 설정할 수도 있습니다. 스캔할 프라이머리 에셋 타입(Primary Asset Types to Scan) 아래에
GameFeatureData베이스 클래스를 사용하는GameFeatureData를 추가하고/Game/Unused디렉터리를 디렉터리(Directories) 배열에 추가합니다. 마지막으로, 규칙(Rules) 을 펼치고 쿠킹 규칙(Cook Rule) 을 항상 쿠킹(Always Cook) 으로 설정합니다. - 이 텍스트가 보이면 스캔할 프라이머리 에셋 타입에 항목을 추가할까요?(Add entry to PrimaryAssetTypesToScan?) 를 클릭하여 문제를 해결합니다. 에디터가
-
콘텐츠 브라우저(Content Browser) 를 사용하여 플러그인의 최상위 레벨 콘텐츠 폴더로 이동합니다. 예시의 경우에는 이름이
MyStandaloneFeature Content입니다. 에셋 패널(Asset Panel) 을 우클릭하고 컨텍스트 메뉴 내에서 기타(Miscellaneous) 를 펼친 다음, 데이터 에셋(Data Asset) 을 선택하여 새로운 데이터 에셋 을 생성합니다. 클래스 목록에서GameFeatureData를 선택하고 플러그인에 지정한 이름에 따라 새로운 에셋 이름을 지정합니다. 이 경우에는 에셋 이름을MyStandaloneFeature로 지정해야 합니다.
이러한 단계를 완료하면, 엔진(또는 에디터) 시작 시 독립형 피처가 로드되도록 설정됩니다. 이제 피처 자체를 개발하고 이를 구현할 액션(Actions) 을 추가할 수 있습니다. 다음과 같은 네 가지 유형의 액션을 사용할 수 있습니다.
| 액션 | 설명 |
|---|---|
| 치트 추가(Add Cheats) | 액션은 치트 매니저(Cheat Manager) 를 확장하여 새로운 '치트 코드'를 생성하거나 기존 치트 코드를 확장합니다. 치트 코드는 디버깅에 유용하며, Shipping 빌드에서는 자동으로 제거됩니다. ~ (물결) 키를 누르면 프로젝트를 실행하는 도중에 이러한 치트 코드를 입력할 수 있는 콘솔이 열립니다. |
| 컴포넌트 추가(Add Components) | 액션은 액터 서브클래스 목록을 가져와 이 목록에 선택적으로 컴포넌트 세트를 추가합니다. 이는 게임 피처 및 모듈형 게임플레이 플러그인을 사용하는 가장 일반적인 방법인데, 컴포넌트는 다양한 행동의 캡슐화에 적합하기 때문입니다. |
| 데이터 레지스트리 추가(Add Data Registry) | 액션은 하나 이상의 데이터 레지스트리를 프로젝트에 추가합니다. 데이터 레지스트리는 전역적으로 등록된 데이터를 효율적으로 저장하고 얻을 수 있는 곳입니다. |
| 데이터 레지스트리 소스 추가(Add Data Registry Source) | 액션은 하나 이상의 데이터 테이블을 기존 데이터 레지스트리에 추가합니다. |
액션을 추가하려면 방금 생성한 데이터 에셋을 엽니다. 액션(ACTIONS) 카테고리를 펼쳐서 액션(Actions) 배열을 노출합니다. 액션 배열에 엘리먼트를 추가하고 적절한 액션 타입으로 설정합니다. 각 액션 타입에 대한 추가 지침은 아래 섹션에서 확인할 수 있습니다.
각 액션 타입 중 하나입니다. 제공된 모든 플러그인에 필요한 만큼 액션을 추가할 수 있습니다.
액션 추가 후에 게임 피처가 예상대로 작동하지 않으면, 에디터를 한 번 재시작해야 할 수도 있습니다. 에디터가 시작될 때 GameFeatureData 에셋이 로드되므로, 에셋을 작동하려면 새로운 GameFeatureData 에셋을 생성한 다음 재시작해야 합니다. 에셋을 처음 생성한 후에만 재시작하면 됩니다. 이후 세션에서 에셋을 업데이트할 때에는 재시작하지 않아도 됩니다.
치트 추가하기
치트 추가 액션은 게임에 치트 매니저 익스텐션(Cheat Manager Extension) 을 등록합니다. 이를 통해 개발자는 독립형 피처의 일부로 자체 디버그 명령('치트 코드')을 생성하고, 피처가 적용될 때마다 이러한 명령을 사용하도록 할 수 있습니다. 치트 매니저와 치트 매니저 익스텐션은 디버깅 툴이므로, Shipping 빌드에서는 인스턴스화되지 않습니다.
컴포넌트 추가
컴포넌트 추가 액션은 개발자가 제공하는 액터와 컴포넌트 클래스 쌍 목록을 살펴보고 일치하는 각 액터에 각 컴포넌트의 인스턴스를 추가하려고 시도합니다. 해당 컴포넌트를 클라이언트에 추가할지 서버에 추가할지, 아니면 둘 다에 추가할지 지정할 수 있습니다. 기본적으로 둘 다에 컴포넌트가 추가됩니다.
피처가 플러그인 내에 완전히 캡슐화되도록 하려면, 추가하는 컴포넌트는 플러그인 자체에서 가져와야 하며, 액터 클래스는 폰(Pawn) 과 같은 내장 엔진 클래스이거나 전형적인 MyPawn 과 같은 엔진 클래스의 프로젝트별 자손이어야 합니다. 이상적으로는, 해당 컴포넌트는 피처와 관련된 모든 프로그램 로직과 데이터 스토리지를 처리해야 합니다.
프로젝트의 액터 서브클래스와의 필수 상호작용을 최소한으로 유지하면, 다른 프로젝트에서 피처를 더 쉽게 구현할 수 있습니다.
컴포넌트 추가 액션에 베이스 액터 클래스를 사용하면 안 됩니다. 이는 지원되지 않으므로 시스템이 해당 액션 부분을 무시할 것입니다. 대신, 컴포넌트가 필요한 액터 서브클래스의 가장 좁은 서브셋을 식별하고 해당 클래스를 지정해야 합니다. 컴포넌트를 받아야 하는 클래스가 여러 개이고 액터 아래에 공통 부모가 없는 경우, 적절한 베이스 클래스를 모두 포함하도록 컴포넌트 추가 액션을 여러 개 설정할 수 있습니다.
컴포넌트 추가 액션으로부터 컴포넌트를 받으려면, 액터가 일반적으로 BeginPlay 이벤트에서 게임 프레임워크 컴포넌트 매니저(Game Framework Component Manager) 를 통해 자신을 등록해야 합니다. 글로벌 게임 프레임워크 컴포넌트 매니저를 가져와 해당 Add Receiver 함수를 호출하여 액터를 Receiver 파라미터로 전달하면 됩니다. 활성 게임 피처가 몇 개든 액터에는 하나의 Add Receiver 호출만 필요합니다. 액터에서 게임 피처와 관련된 모든 컴포넌트를 제거하려면 게임 프레임워크 컴포넌트 매니저의 Remove Receiver 함수를 사용합니다.
액터의 BeginPlay 이벤트에서 컴포넌트를 받도록 등록
컴포넌트 추가 액션으로부터 컴포넌트를 받으려면 액터가 UGameFrameworkComponentManager 싱글톤 인스턴스를 통해 자신을 등록하고 AddReceiver 함수에 전달해야 합니다. 이는 일반적으로 BeginPlay 에서 수행됩니다. 코드는 다음과 같아야 합니다.
if (UGameFrameworkComponentManager* ComponentManager = GetGameInstance()->GetSubsystem<UGameFrameworkComponentManager>())
{
ComponentManager->AddReceiver(this);
}
데이터 레지스트리 추가하기
데이터 레지스트리 추가 액션으로 프로젝트에 전체 데이터 레지스트리를 추가할 수 있습니다. 추가하려는 데이터 레지스트리 에셋 경로로 이 액션을 환경설정합니다. 데이터 레지스트리에 대한 자세한 내용은 데이터 레지스트리 페이지를 참조하세요.
데이터 레지스트리 소스 추가하기
데이터 레지스트리로 스트리밍되는 데이터 소스를 추가하려면, 데이터 레지스트리 소스 추가 액션을 사용합니다. 각 데이터 소스에 대한 경로와 데이터 소스를 로드할 데이터 레지스트리 이름, 관련 우선순위 및 사용 플래그를 환경설정해야 합니다. 시작 시 게임 피처가 로드되면, 적절한 식별자가 드롭다운 목록에 채워집니다. 자세한 내용은 데이터 레지스트리 페이지의 데이터 레지스트리 소스(Data Registry Sources) 섹션을 참조하세요.