게임플레이 어빌리티 시스템(GAS)을 싱글플레이에서 사용할 때와 데디케이티드 서버(Dedicated Server) 기반의 멀티플레이에서 사용할 때는 아키텍처 접근 방식 자체가 완전히 달라진다. 멀티플레이어 환경에서는 "서버는 클라이언트의 화면을 볼 수 없고, 마우스도 없는 장님"이라는 대전제를 항상 기억해야 한다.
AAA급 액션 디펜스 게임 개발을 위해 반드시 알아야 할 4가지 핵심 차이점을 정리해본다.
1. 입력과 타겟팅: "서버에는 마우스가 없다"
- 싱글플레이 (Standalone):
- 어빌리티(
UGameplayAbility) 내부에서APlayerController::GetHitResultUnderCursor()를 직접 호출하여 마우스 위치를 가져오고 즉시 번개를 소환해도 완벽하게 작동한다.
- 어빌리티(
- 멀티플레이 (Dedicated Server):
- 서버에서 실행되는 어빌리티는 플레이어의 마우스나 키보드 상태를 알 수 없다.
- 해결책 (Payload 기반 이벤트 전달): 클라이언트의 입력 처리부(Character C++)에서 마우스 레이캐스트(Raycast)를 수행하여 3D 좌표를 구한다. 이 좌표를
FGameplayEventData나FGameplayAbilityTargetData라는 '택배 상자(Payload)'에 포장한 뒤,SendGameplayEventToActor를 통해 서버의 어빌리티로 전달(RPC)해야 한다.
2. 네트워크 실행 정책 (Net Execution Policy)과 타격감
멀티플레이 액션 게임의 생명인 '타격감(반응성)'은 어빌리티의 실행 정책에서 결정된다. GA를 BP로 만들면 설정할 수 있다.
- Local Only (싱글 전용): 클라이언트에서만 실행된다. 멀티플레이에서는 데미지 판정이 서버와 동기화되지 않으므로 사용하지 않다.
- Server Only: 가장 안전하고 핵(Hack) 방지에 강력하다. 하지만 클라이언트가 버튼을 누르고 서버까지 패킷이 왕복하는 시간(Ping) 동안 캐릭터가 아무 행동도 하지 않아 극심한 입력 지연(Input Lag)이 발생한다.
- Local Predicted (강력 추천):
- 클라이언트가 버튼을 누르는 즉시(예측, Prediction) 애니메이션과 가짜 이펙트를 먼저 재생하여 유저에게 쾌적한 조작감을 제공한다.
- 동시에 서버로 실행 의도를 보내어 진짜 데미지 연산과 자원(마나) 소모를 처리한다. 만약 서버 검증에서 실패하면(예: 마나 부족), 클라이언트의 행동을 강제로 취소(Rollback)시킨다.
🏛️ Local Predicted 어빌리티 실행 흐름도

3. 리플리케이션 모드 (Replication Mode) 최적화
ASC(Ability System Component)가 데이터를 네트워크 너머로 동기화하는 방식이다. 프로젝트의 장르와 규모에 따라 다르게 설정해야 서버 대역폭(Bandwidth)을 아낄 수 있다.
- Full Mode (싱글 / 소규모 코옵): 모든 게임플레이 이펙트(GE)와 어트리뷰트(체력, 마나 등)가 모든 클라이언트에게 전송된다. 4인 디펜스 게임의 플레이어 캐릭터들에게는 적합할 수 있다.
- Mixed Mode (액션 / 일반적 멀티플레이 권장):
- 나 자신(Owner): 나의 GE와 어트리뷰트는 나에게 모두 전송된다. (내 UI에 버프 지속시간 등을 표시해야 하므로)
- 다른 플레이어 (Simulated Proxy): 다른 사람의 GE(버프/디버프 상세 정보)는 전송되지 않고, '결과적으로 변한 체력' 같은 핵심 어트리뷰트와 태그(Tag)만 동기화된다. 네트워크 최적화의 핵심이다.
- Minimal Mode (MOBA / MMO): 어트리뷰트와 태그조차 최소한으로 동기화한다. 수백 마리의 적(AI) 몬스터 ASC에 주로 사용한다.
4. 시각적 연출 (VFX/SFX)의 분리: Gameplay Cue
- 싱글플레이: 어빌리티 그래프 내에서
Spawn System at Location노드로 나이아가라를 직접 생성해도 된다. - 멀티플레이: 서버는 그래픽 카드(GPU)가 없는 환경이므로 파티클을 스폰하거나 소리를 재생할 수 없다. 어빌리티 로직 안에 시각적/청각적 코드를 하드코딩하면 서버 자원을 낭비하거나 에러를 낸다.
- 해결책 (Gameplay Cue): 어빌리티 내부에서는 "여기에 번개 연출을 틀어라!"라는 게임플레이 큐(Gameplay Cue) 신호(태그)만 방송(NetMulticast)한다.
- 그러면 그 신호를 받은 각 클라이언트의 컴퓨터가 알아서 자신의 화면에 나이아가라 이펙트와 천둥소리를 재생한다. 로직과 렌더링을 완벽하게 분리하는 객체지향적 아키텍처이다.
'프로그래밍 > Unreal Engine 5' 카테고리의 다른 글
| [Unreal Engine 5] 멀티플레이어 디버깅 유틸리티 & WorldContext (0) | 2026.04.06 |
|---|---|
| [Unreal Engine 5] Module과 Plugin의 차이점 (0) | 2026.04.02 |
| [Unreal Engine 5] 언리얼 엔진의 포인터 안전성 검사: Null 체크 vs IsValid vs C++17 (0) | 2026.03.27 |
| [Unreal Engine5] 멀티플레이 최적화 Relevancy, NetPriority, NetDormancy의 이해 (0) | 2026.03.25 |
| [UnrealEngine 5] 멀티플레이 최적화 : NetUpdateFrequency와 클라이언트 보간 (0) | 2026.03.24 |