
이번 작업에서는 CrimsonMoon 프로젝트에 NPC 대화(Npc Dialogue) 시스템을 1차적으로 구현하고, 위젯/액터/게임 인스턴스/로컬 이벤트 매니저 간의 구조를 정리하여 구현하였습니다. 특히, C++과 UMG를 섞어 쓰는 환경에서 델리게이트 기반 이벤트 흐름과 위젯/액터 간 의존성 최소화를 목표로 진행했습니다.
ACMNpcBase : NPC 액터, 대화 트리 데이터/진행 로직 보유UCMDialoagueNode / UCMActionNode : 대화 노드 & 액션 노드 트리 구조UCMLocalEventManager : GameInstanceSubsystem, 대화용 델리게이트 허브UCMGameInstance : GameInstance, 로컬 이벤트 매니저/세션 등 상위 관리UCMNpcDialogueWidget : 대화 전체 UI, 텍스트/Next 버튼/선택지 컨테이너UCMNpcDialogueChoiceElement : 개별 선택지 버튼 위젯UUIManagerComponent : PlayerController에 부착, UI 스택 관리 및 뷰포트 표시


다음 플로우 차트는 이벤트 흐름을 나타냅니다.

GameInstanceSubsystem 활용
UCMLocalEventManager 를 UGameInstanceSubsystem 으로 두어, 맵 전환과 무관하게 대화 델리게이트를 공유 가능하게 설계델리게이트 기반 UI-로직 분리
액션 노드(선택지) 구조
UCMDialoagueNode 를 기본으로 하되, 선택지가 필요한 경우 파생 클래스 UCMActionNode 로 표현DialogueText (선택지에 표시할 텍스트)ActionType (ECMNpcComponentType) 을 가지며,EndDialogue 시 델리게이트 해제 철저
EndDialogue() 에서 NPC ↔ LocalEventManager 간의 모든 바인딩을 명시적으로 해제이번 NPC 대화 시스템 구현은 데이터 구조(트리 기반 대화 노드), 델리게이트 기반 이벤트 흐름, UI/로직 분리, GameInstanceSubsystem 활용이라는 네 가지 축을 중심으로 설계하고 구현하였습니다. 그 과정에서 UMG 바인딩, 델리게이트 시그니처, 포인터 관리 등 언리얼 특유의 함정들을 실제로 밟아 보며 정리할 수 있었고, 이를 통해 프로젝트 전반에서 재사용 가능한 패턴을 쌓을 수 있었다고 생각합니다.
앞으로는 이 구조 위에 퀘스트 시스템 연동, 세이브/로드 시 대화 상태 복원, 로컬라이제이션(다국어 지원) 등을 확장해 나가면서 NPC와의 상호작용 경험을 더욱 풍부하게 만들어 볼 계획입니다.