[Unreal] 리플리케이션 (Replication), Remote Procedure Call (RPC)
언리얼 C++에서 서버와 클라이언트 각각에서 실행되는지 여부를 잘 체크해야 한다. PROPERTY Replication과 RPC의 사용방법에는 차이가 있다. 두 방법의 차이점을 파악하고 상황에 맞게 활용하자.
목차
리플리케이션 (Replication)
액터 리플리케이션 (Actor Replication)
리플리케이션은 액터(Actor)를 기준으로 실행된다.
Server는 액터 목록을 유지하고, Client에서 (리플리케이트되도록 마킹된) 각 액터에 대한 근접 추정치를 유지할 수 있도록 클라이언트를 주기적으로 업데이트한다.
액터 업데이트 방식: 프로퍼티 업데이트, RPC
액터의 업데이트 방식:
- 변수 리플리케이션 (PROPERTY Update)
- RPC (Remote Procedure Call)
프로퍼티는 변경될 때마다 자동으로 Replicate 된다.
반면에, RPC는 실행될 때만 Replicate 된다.
1. 변수 리플리케이션 (PROPERTY Update)
언리얼에서 제공하는 프로퍼티 업데이트 방법은 다음과 같다. 이 때 자료형은 AActor*나 그 하위 클래스여야 한다.
① UPROPERTY() 매크로에 Replicated 명시하기
- UPROPERTY 매크로에서 Replicated 또는 ReplicateUsing 지정자를 사용한다.
- Authority에 있는 액터에서 리플리케이티드 변수의 값이 변경될 때마다, 해당 정보가 자동으로 Authority 있는 액터에서 세션에 접속된 원격 프록시로 전송된다.
② GetLifetimeReplicatedProps 함수 사용
② 생성자에서 bReplicated = true; 설정
- C++ 액터 클래스에서 bReplicates 변수를 설정하여 특정 클래스의 액터에 대한 리플리케이션을 활성화할 수 있다.
AWeapon::AWeapon()
{
bReplicates = true; //만약 false라면 replicated되지 않아 모든 플레이어가 Authority를 가지게 된다. 예를 들어 플레이어1이 총을 발사하면 다른 플레이어들도 (각각의 독립된 서버가 존재하기 때문에) 총이 발사된다. 하지만 bReplicates=true라면 서버 하나만 Authority를 가지고 관리한다. 플레이어1이 총을 발사하면 서버에 정보를 알리고 모든 Client에 전파한다.
SetReplicateMovement(true); // 무기의 Movement를 Replicated 해준다.
WeaponMesh = CreateDefaultSubobject<USkeletalMeshComponent>(TEXT("WeaponMesh"));
SetRootComponent(WeaponMesh);
}
2. RPC (Remote Procedure Call)
Replicated와 Replicated Notify는 복제이고 RPC는 통신이다!
Replicated | Replicated Notify | RPC | |
단순 복제 | 복제 후 특정 시점에 지정한 함수 호출 | 즉시 알림. 통신. | |
스케쥴링. 모은 다음에 복제. 그 틱에 바로 가지 않는다 |
Replicated와 마친가지로 즉시 복제는 안 된다. | 수집하지 않음. 데이터를 복제시키지 않음. 그냥 통신한다. 내가 원하는 시점에 통신으로 이벤트를 날린다. |
|
어느 시점에 바뀌는지 알지 못하지만 안전하게 바꾸고 싶을때 사용한다. | 복제된 시점에 지정된 이벤트 함수(OnRep_OOO)를 호출하는 방식으로 사용한다. | 그 시점에 이벤트를 파라미터와 복제본에서 원본으로 RPC 이벤트를 날릴 수 있다. 반면에 Replicate로는 복제본에서 원본으로 날릴 수 없다. |
※ 주의사항) RPC
Replicated와 같은 Tick에 RPC를 날리면 안 된다!!!
ex. 총을스폰 시킨 후 총을 반짝이는 기능을 구현하고 싶다. 총을 스폰시킨 시점(Replicated 된 시점)에 반짝이게 하는 RPC를 날리면 안 된다. 총이 스폰되기 전에 반짝이는 함수를 콜하면 총이 없어 크래쉬가 난다. 네트워크 환경이 좋아 만약 통과하면 최악이다. 문제를 찾기가 힘들다.
->> 해당 경우는 RPC가 아닌 Replicated Notify를 사용해서 총이 스폰된 시점(또는 스폰된 이후)에 반짝이는 기능의 함수를 호출하게 한다.
참고자료
https://docs.unrealengine.com/5.0/ko/networking-overview-for-unreal-engine/
'⭐ Unreal Engine > UE 개념정리' 카테고리의 다른 글
[UE] BindWidget, BindWidgetOptional, BindWidgetAnim (0) | 2023.12.04 |
---|---|
[UE] 빌드 환경설정(Build Mode): Debug, DebugGame, Development, Shipping (0) | 2023.11.15 |
[Unreal] 언리얼의 서버모델: 리슨서버, 데디케이티드 서버, 리플리케이션(Replication) (0) | 2023.09.15 |
[Unreal] 컴파일 과정 (UBT, UHT 호출시점) (0) | 2023.09.11 |
[Unreal] Assert란? Assert 3종류: Check, Verify, Ensure (0) | 2023.06.13 |
댓글
이 글 공유하기
다른 글
-
[UE] BindWidget, BindWidgetOptional, BindWidgetAnim
[UE] BindWidget, BindWidgetOptional, BindWidgetAnim
2023.12.04 -
[UE] 빌드 환경설정(Build Mode): Debug, DebugGame, Development, Shipping
[UE] 빌드 환경설정(Build Mode): Debug, DebugGame, Development, Shipping
2023.11.15 -
[Unreal] 언리얼의 서버모델: 리슨서버, 데디케이티드 서버, 리플리케이션(Replication)
[Unreal] 언리얼의 서버모델: 리슨서버, 데디케이티드 서버, 리플리케이션(Replication)
2023.09.15 -
[Unreal] 컴파일 과정 (UBT, UHT 호출시점)
[Unreal] 컴파일 과정 (UBT, UHT 호출시점)
2023.09.11