Notice
Recent Posts
Recent Comments
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
Tags
- 정렬
- 애셋로드
- 강참조
- 람다
- moreeffectiveC++
- 약참조
- 스마트포인터
- 크리티컬섹션
- 데이터애셋
- dataasset
- 알고리즘
- stl
- map
- makeweakobjectptr
- UML관련
- 자료구조
- 정렬알고리즘
- tweakobjectptr
- C++
- C++최적화
- UE_LOG
- enumasByue
- 비동기호출방법
- 델리게이트
- BFS
- 언리얼가비지컬렉터
- 구조적 바인딩
- 프로그래머스
- unorder_map
- 선택정렬
Archives
- Today
- Total
기억을 위한 기록들
[UE] 언리얼엔진 RPC와 Replication 에 관하여 본문
1. 들어가며
언리얼 엔진에서 멀티플레이 게임을 개발하려면 RPC(Remote Procedure Call)와 Replication의 정확한 이해가 필수적이다.
언리얼은 서버-클라이언트 구조를 기반으로 하고 있으며, 단순히 UFUNCTION()을 호출한다고 해서 클라이언트와 서버가 같은 결과를 얻는 것은 아닙니다. 이 글에서는 RPC의 종류, Replication의 원리, 그리고 클래스별 네트워크 특성을 정리해보려고한다.
참고 자료 :
https://dev.epicgames.com/documentation/ko-kr/unreal-engine/remote-procedure-calls-in-unreal-engine
2. 왜 중요한가?
멀티플레이 게임에서 가장 큰 문제는 데이터 불일치입니다.
- 클라이언트에서만 처리하면 → 치트 가능성 (예: 무한 체력, 순간 이동)
- 서버에서만 처리하면 → 응답 지연(레이턴시) 때문에 플레이어 경험이 나빠짐
이를 해결하기 위해 언리얼은 서버 권한(authority) 구조 + RPC 호출 방식 + Replication 동기화를 제공합니다.
즉, 어떤 로직은 서버에서, 어떤 로직은 클라이언트에서 실행해야 하는지를 정확히 구분할 수 있어야 안정적인 멀티플레이 게임을 만들 수 있습니다.
3. RPC 종류 정리
예시)
UFUNCTION(Server, Reliable) // 클라이언트에서 호출하면 서버에서 실행
void Server_DoAction();
UFUNCTION(Client, Reliable) // 서버에서 호출하면 특정 클라이언트에서 실행
void Client_NotifyAction();
UFUNCTION(NetMulticast, Unreliable) //서버에서 호출하면 모든 클라이언트에서 실행
void Multicast_PlayEffect();
- Server RPC
- 클라이언트 → 서버로 호출
- 서버 권한이 필요한 로직 (탄환 스폰, 데미지 판정 등)에서 사용
- Client RPC
- 서버 → 특정 클라이언트로 호출
- UI 업데이트, 개인 알림 등 개별 처리에 적합
- NetMulticast RPC
- 서버 → 모든 클라이언트로 호출
- 이펙트, 사운드 재생 같은 전역적 이벤트에 활용
4. Replication과 클래스별 네트워크 특성
- GameMode: 서버 전용, 클라이언트에는 존재하지 않음 → RPC 불가능
- GameState: 서버에서 관리 + 클라에 자동 복제 → 전역 상태 공유
- PlayerState: 각 플레이어 고유 상태, 클라에 복제 → 점수, 닉네임, Ping 등
- Actor / Component: 일반 객체, bReplicates = true 설정 시 네트워크 동기화 가능
5. 실제 예시: 총알 발사 로직
총알 발사 동작을 구현한다고 가정해봅시다.
- 클라이언트 입력
void AMyCharacter::Input_Fire() {
if (HasAuthority())
{
// 서버라면 바로 실행
HandleFire();
} else {
// 클라이언트라면 서버 RPC 요청
Server_Fire();
}
}
2. 서버에서 탄환 스폰
UFUNCTION(Server, Reliable)
void Server_Fire() {
HandleFire(); // 탄환 생성 및 데미지 판정
}
3. 모든 클라이언트에 이펙트 전파
UFUNCTION(NetMulticast, Unreliable)
void Multicast_PlayMuzzleFlash() {
UGameplayStatics::SpawnEmitterAttached(MuzzleFlash, WeaponMesh);
}
이렇게 하면:
- 클라이언트는 서버에게 발사를 요청하고,
- 서버는 탄환을 생성하며,
- 모든 클라이언트는 같은 이펙트를 보게 됩니다.
6. 마무리
RPC와 Replication은 언리얼 엔진의 멀티플레이 아키텍처 핵심 언어입니다.
- Server / Client / Multicast RPC를 정확히 구분할 수 있어야 하고,
- GameMode / GameState / PlayerState 같은 클래스별 네트워크 특성을 이해해야 합니다.
- 실무에서는 단순 호출이 아니라 보안(치트 방지), 성능(최소 패킷 전송), **플레이 경험(레이턴시 보정)**까지 고려해야 합니다.
'UnrealEngine' 카테고리의 다른 글
| [UE][영상 참고 글]Unreal Engine에서 모듈식 & 확장 가능한 UI 시스템 만들기 (0) | 2025.12.26 |
|---|---|
| [UE] FGCObject에 관하여 (1) | 2025.11.11 |
| [UE] 월드 내 액터 탐색 할 때에는 TActorIterator 라는 클래스 템플릿이 있다. (1) | 2025.07.01 |
| [UE] UObject 객체에 대해 참조 할때, TWeakObjectPtr<T> 템플릿 클래스 말고도, MakeWeakObjectPtr 함수가 있다. (0) | 2025.06.08 |
| [UE] 블루프린트에서 비동기방식을 다루고 싶다면 UBlueprintAsyncActionBase 클래스를 사용하자. (0) | 2025.05.31 |