UE5.7 C++ 게임 클라이언트(Client02)와 네이티브 C++ Windows 컨트롤 패널(ControlPannel)을 TCP JSON 프로토콜로 연결하여 NPC 캐릭터를 원격 제어하는 로컬 테스트 시스템.
- UE5.7에서
NavMeshBoundsVolume을 배치하고 Nav Mesh를 빌드합니다.
- UE5.7 에디터 메뉴의 **Tools > Nav Export > Export NavMesh to BIN...**을 실행하여
NavMesh.bin파일을 Export합니다.
ControlPannel에서ReadNavBin으로NavMesh.bin파일을 읽어 들입니다.Connect를 눌러 UE5.7 클라이언트에 연결한 뒤SpawnAll을 실행하여 10개의 Character를 화면에서 확인합니다.
AutoMoveAll명령으로 전체 Character 자동 이동 테스트를 수행합니다.
NPC-X/
├── Client02/ ← UE5.7 C++ 게임 클라이언트
│ ├── Source/Client02/
│ │ ├── CommandServer ← TCP 수신 서브시스템 (포트 7777)
│ │ ├── Client02GameMode ← 탑다운 게임 모드, 고정 카메라
│ │ ├── FixedCameraSubsystem ← 고정 카메라 관리
│ │ ├── Variant_Strategy/ ← 전략 게임 변형 (RTS 스타일)
│ │ └── Variant_TwinStick/ ← 트윈스틱 슈터 변형 (NPC AI 포함)
│ └── Plugins/WorldUtilsEditor/
│ └── Source/WorldUtilsEditor/
│ ├── NavExportCommand ← 에디터 메뉴 커맨드 등록
│ ├── NavigationExporter ← NavMesh → OBJ / BIN 익스포터
│ └── WorldUtilsEditorModule ← 플러그인 모듈 진입점
│
└── ControlPannel/ ← C++ WinAPI 컨트롤 패널 (명령 송신)
├── ControlPannel.cpp ← 메인 윈도우, UI 레이아웃
├── TcpClient.h/.cpp ← TCP 연결/재연결, 수신 루프, 하트비트
├── JsonBuilder.h ← JSON 명령 직렬화 (헤더 전용)
└── detour/ ← Detour 네비게이션 라이브러리 (로컬)
[ControlPannel] ──── TCP 127.0.0.1:7777 ────> [Client02 (UE5.7)]
TcpClient UCommandServer
JsonBuilder FCommandClientWorker (per-client thread)
detour/ (경로 계산) AIController::MoveToLocation()
NavMesh.bin (로드) NavMesh + Detour 경로탐색
- 단방향 제어: ControlPannel이 명령을 송신, UE가 실행
- 응답 이벤트:
actor_position,random_position등 UE → ControlPannel 역방향 전송 가능 - 로컬 전용: 네트워크 멀티플레이 없음, 127.0.0.1 고정
각 명령은 \n으로 구분되는 한 줄 JSON.
{"v":1,"type":"command","cmd":"spawn","options":{"actorId":"Unit001","characterType":"Soldier","location":{"x":0,"y":0,"z":100}}}
{"v":1,"type":"command","cmd":"destroy","options":{"actorId":"Unit001"}}
{"v":1,"type":"command","cmd":"move_to_position","options":{"actorId":"Unit001","location":{"x":500,"y":200,"z":100}}}
{"v":1,"type":"command","cmd":"get_position","options":{"actorId":"Unit001"}}
{"v":1,"type":"command","cmd":"find_random_position","options":{"actorId":"Unit001"}}
{"v":1,"type":"heartbeat"}{"v":1,"type":"event","event":"actor_position","actorId":"Unit001","location":{"x":0,"y":0,"z":100}}
{"v":1,"type":"event","event":"random_position","actorId":"Unit001","location":{"x":300,"y":150,"z":100}}Visual Studio에서 Client02/Client02.sln 열고 빌드하거나 UE Editor에서 직접 빌드.
UnrealBuildTool.exe Client02Editor Win64 Development "E:/Work/NPC-X/Client02/Client02.uproject"
Visual Studio에서 ControlPannel/ControlPannel.sln 열고 빌드.
| 항목 | 값 |
|---|---|
| 플랫폼 | x64 |
| 구성 | Debug / Release |
| 의존성 | ws2_32.lib, comdlg32.lib, detour (로컬 서브프로젝트) |
UE Editor의 Tools > Nav Export 메뉴를 통해 NavMesh를 파일로 내보냅니다.
ControlPannel의 Detour 경로탐색에서 이 파일을 로드합니다.
| 기능 | 출력 형식 | 용도 |
|---|---|---|
| Export NavMesh to OBJ | .obj |
NavMesh 형상 시각화 |
| Export NavMesh to BIN | .bin |
ControlPannel의 Detour 경로탐색 |
BIN 포맷: MSET 매직 + Hybrid 헤더(LWC double) + Detour 타일 raw bytes.
TCP 수신은 백그라운드 스레드(FCommandClientWorker)에서 처리하고,
Actor 조작은 반드시 GameThread로 전환 후 실행.
AsyncTask(ENamedThreads::GameThread, [Handler, Line]()
{
(*Handler)(Line);
});UObject 포인터를 백그라운드 스레드 람다에서 직접 캡처하면 크래시. SharedLineHandler 패턴으로 우회.
UE가 꺼진 상태에서도 ControlPannel이 크래시 없이 재연결을 시도.
TcpClient의 RecvLoop가 소켓 오류 감지 시 OnStateChanged(false) 콜백으로 UI에 통보.
| 변형 | 위치 | 특징 |
|---|---|---|
| Strategy | Variant_Strategy/ |
RTS 스타일, 탑다운 카메라, 유닛 직접 선택 |
| TwinStick | Variant_TwinStick/ |
트윈스틱 슈터, AI NPC (StateTree), 스포너, 발사체 |