Best Practices for Networked Movement Abilities | Unreal Fest Bali 2025
- 네트워크 이동 능력은 반응성, 일관된 위치, 공정성, 보안 유지라는 까다로운 요구사항 때문에 구현하기 매우 어렵습니다. 🎮
- 주요 난관으로는 예측 불가능한 지연 시간(latency), 네트워크 지터, 패킷 손실, 그리고 클라이언트와 서버 간의 RPC 도착 시간 불일치로 인한 상태 불일치가 있습니다. ⏳
- 클라이언트와 서버는 본질적으로 항상 약간 다른 상태를 유지하며, 클라이언트는 자신의 캐릭터에 대해 앞서고 서버는 NPC에 대해 앞서며, 다른 클라이언트는 더 앞서 있어 상태 동기화 및 유효성 검사가 복잡합니다. 🌐
- 디버깅을 위해 PIE(Play In Editor)에서 네트워크 에뮬레이션(고정/가변 지연, 패킷 손실)을 활성화하여 다양한 네트워크 문제를 재현하고 테스트할 수 있습니다. 🧪
p.net show corrections 콘솔 변수를 사용하면 클라이언트에서 수정이 발생했을 때 예측 위치(빨간색)와 수정 후 위치(녹색)를 시각적으로 확인할 수 있습니다. 🔴🟢
- Visual Logger에 이벤트를 추가하여
OnClientCorrectionReceived나 SaveMoves::PostUpdate와 같은 함수에서 수정 및 재시뮬레이션의 중간 단계를 상세히 검사할 수 있습니다. 📊
- 로컬에서 서버와 클라이언트를 단일 프로세스로 실행할 때 메모리 공유 트릭을 사용하여 서버의 캐릭터 위치를 클라이언트에 시각화하여 지연 효과와 오류 누적을 파악할 수 있습니다. 🧠
- 언리얼 엔진의 Character Movement Component(CMC)는 클라이언트가 서버로 이동 정보를 자주 전송하고 서버가 이에 응답하는 방식으로 작동합니다. 🔄
SavedMove는 클라이언트가 재시뮬레이션에 필요한 모든 것을 기록하고, NetworkMove는 서버가 동일한 움직임을 실행하는 데 필요한 정보를 담고 있습니다. 📦
- 클라이언트는 서버 부하를 줄이기 위해 여러 틱에 걸쳐 유사한 움직임(예: 직선 이동, 스트레이핑, 낙하)을
SaveMove::CanCombineWith 로직에 따라 결합하여 전송합니다. 🤝
- 새로운 이동 능력을 개발할 때는
SaveMove::CanCombineWith 함수를 재정의하여 움직임 결합 로직을 커스터마이징해야 할 수 있습니다. 🛠️