-
Unreal RPCUnreal Engine 2024. 4. 21. 17:36
청록 - 클라이언트에서 실행
보라 - 서버에서 실행
주황 - 오너십과 무관하게 연관성으로 동작
1. 서버에서 RPC를 호출하는 경우
(1) 언리얼은 서버가 모든 권한을 가지기 때문에 어떤 경우에서도 모두 호출이 되지만, 바람직하지는 않음
(2) 서버가 소유하지 않는 액터에서 서버 RPC를 사용하면 서버는 RPC 구현부의 _Implementation 함수를 호출하지만, 이것은 원하는 플로우가 아님
(3) 서버가 소유하지 않는 액터에서 클라이언트 RPC를 사용하면 서버는 RPC 구현부의 _Implementation 함수를 호출하지만, 전달한 클라이언트는 없기 때문에 의도와 다르게 동작함
(4) 서버에서 서버 RPC나 클라이언트 RPC를 사용할 경우 해당 액터가 오너십을 가지는지 살펴보는 것이 중요함
(5) NetMulticast의 경우 연관성으로 동작하기 때문에 모든 경우에 동작함
2. 클라이언트에서 RPC를 호출하는 경우
(1) 호출한 클라이언트가 오너가 아닌 경우 모두 버려짐 = 통신이 일어나지 않음
(2) 오너십을 가지고 있는 액터가 서버 RPC를 호출할 때만 동작함
RPC(Remote Procedure Call): 원격 컴퓨터에 있는 함수를 호출할 수 있도록 만든 통신 프로토콜
언리얼 엔진에서 클라이언트에서 서버로 통신하는 유일한 수단을 제공함
클라이언트에서 서버로 명령이 가능함
(1) 클라이언트
- 서버에서 클라이언트로 호출하는 RPC
(2) 서버
- 클라이언트에서 서버로 호출하는 RPC
- 언리얼 엔진 구조에서 유일하게 클라이언트가 서버의 함수를 호출할 수 있는 기능
- 서버 쪽에서 클라이언트의 명령을 검증할 수 있는 함수를 구현할 수 있음 (악의적인 함수가 아닌지)
(3) 넷 멀티캐스트
- 서버를 포함해 모든 플레이어에게 명령을 보내는 RPC
- 프로퍼티 리플리케이션과 유사하게 연관성 기반으로 동작함(커넥션을 소유하지 않아도 동작)
- 연관성을 잃는다면 동작하지 않음
RPC 선언에 관한 키워드
Unreliable: RPC 호출을 보장하지 않는 대신 빠름
Reliable: RPC 호출을 보장하지만, 정말 필요할 때만 호출
WithValidation: 서버에서 검증 로직을 추가로 구현할 때 추가하는 옵션
UFUNCTION(NetMulticast, Unreliable) void MulticastRPCChangeLightColor(const FLinearColor& NewLightColor); UFUNCTION(Server, Unreliable, WithValidation) void ServerRPCChangeLightColor(); UFUNCTION(Client, Unreliable) void ClientRPCChangeLightColor(const FLinearColor& NewLightColor); // 이때 구현부는 뒤에 접미사 _Implementation을 붙여야 함 void AABFountain::MulticastRPCChangeLightColor_Implementation(const FLinearColor& NewLightColor) {} void AABFountain::ServerRPCChangeLightColor_Implementation() {} void AABFountain::ServerRPCChangeLightColor_Validate() {} void AABFountain::ClientRPCChangeLightColor_Implementation(const FLinearColor& NewLightColor) {}
RPC 사용 시 주의점
(1) 각 RPC 종류마다 올바르게 사용할 것 e.g. 클라이언트에서 서버 RPC가 아닌 클라이언트 RPC를 사용하면, 버려지게 됨
(2) Client, NetMulticast는 서버에서만 호출 / Server는 클라이언트에서만 호출
(3) Client, Server는 오너십을 가지고 있는 액터에서 호출
: 컨트롤러: IsLocalController(), 폰: IsLocallyControlled()로 확인 가능
(4) Tick 및 플레이어 입력 등 빈번하게 호출되는 함수에 Reliable RPC를 사용하지 말 것 -> 대기열이 넘칠 수 있음
(5) NetMulticast RPC의 잦은 사용은 네트워크 부하를 가중시킴
(6) 게임 플레이 및 액터 상태에 영향을 미치는 경우, RPC보다는 프로퍼티 리플리케이션을 사용할 것
Property Replication vs NetMulticast RPC
'Unreal Engine' 카테고리의 다른 글
4 principles for network multiplay (0) 2024.04.23 [For loof] Find All PlayerControllers (0) 2024.04.21 Actor Replication Flow in Low Level (0) 2024.04.20 Actor Priority & Dormancy(휴면) (0) 2024.04.20 Actor Replication's Relevancy (0) 2024.04.20