오늘은 ACMNpcBase를 중심으로, 다양한 NPC 기능(대화, 퀘스트, 상점 등)을 컴포넌트 기반으로 확장할 수 있는 구조를 설계하였습니다. 이 구조를 통해 이후 요구사항 변화에 유연하게 대응할 수 있도록 확장성과 유지보수성을 고려한 아키텍처를 목표로 하였습니다.
ACMNpcBaseUCMNpcComponentBase 파생 클래스들ECMNpcComponentType + HandleActionByType() 조합으로 컴포넌트 접근ACMNpcBase : AActor, ICMNpcHandlerICMNpcHandler 인터페이스를 구현하여 외부에서 통합된 방식으로 NPC에 요청 전달ICMNpcHandlerHandleActionByType(ECMNpcComponentType ComponentType)UCMNpcComponentBaseECMNpcComponentTypeDefault, DialogueComponent, QuestComponent, ShopComponent 등 정의
NpcCameraComponentCapsuleComponentMeshComponentNpcComponents 배열로 부착된 컴포넌트들을 보관RegisteredComponentMap<ECMNpcComponentType, UCMNpcComponentBase*>로 타입-컴포넌트 매핑RegisterComponent(ECMNpcComponentType ComponentType, UCMNpcComponentBase* NewComponent)PerformRegisterComponent(...)PerformInteract()ECMNpcComponentType를 결정 후 HandleActionByType() 호출 가능HandleActionByType(ECMNpcComponentType ComponentType)RegisterComponent(ECMNpcComponentType ComponentType, UCMNpcComponentBase* NewComponent)ECMNpcComponentType::DialogueComponentECMNpcComponentType::QuestComponentECMNpcComponentType::ShopComponentECMNpcComponentType::TrainingComponent, CraftComponent 등)을 추가할 때UCMNpcComponentBase 파생 컴포넌트 생성RegisterComponent()를 통해 ACMNpcBase에 등록HandleActionByType() 호출 구조는 그대로 유지ICMNpcHandler, UCMNpcComponentBase)를 통해 일관된 사용법 제공ECMNpcComponentType ComponentTypeRegisteredComponentMap에서 해당 타입의 컴포넌트 조회UCMNpcComponentBase::HandleAction() (또는 유사 메서드) 호출StartDialogue(), ProceedToNextNode(ChoiceIndex), EndDialogue() 등의 메서드 제공HandleAction()에서 초기 진입점(StartDialogue()) 호출ACMNpcBase::PerformInteract() 호출HandleActionByType(ECMNpcComponentType::DialogueComponent)HandleActionByType(ECMNpcComponentType::QuestComponent)HandleActionByType(ECMNpcComponentType::ShopComponent)HandleActionByType(DialogueComponent) 호출부는 변경 없이 유지 가능이번 NPC 설계에서는 Actor + Interface + Component + Enum을 조합하여, NPC의 다양한 기능을 느슨하게 결합된 형태로 구성해 보았습니다. 특히 HandleActionByType()과 ECMNpcComponentType을 활용하여 컴포넌트에 접근하는 방식은, 이후 Dialogue, Quest, Shop 컴포넌트가 추가되더라도 외부 인터페이스를 거의 건드리지 않고 확장이 가능하다는 장점이 있었습니다.
앞으로는 실제 트리형 Dialogue 데이터를 설계하고, 이를 처리하는 Dialogue 컴포넌트를 구현하면서, 이번에 정의한 NPC 베이스 구조가 얼마나 유연하게 동작하는지 검증해 볼 예정입니다. 이를 통해 상호작용이 복잡해지는 RPG 스타일 게임에서도 유지보수성과 확장성을 동시에 확보하는 NPC 아키텍처를 완성하는 것을 목표로 삼겠습니다.