아래 표를 이해하기 위해 미리 알아야 할 지식
Calling Machine = 실행하는 위치(Client, Server)
Owning Connection = 실행자의 소유권을 누가 가지고 있는지.
Invoking Client : 실행자와 플레이어가 동일
Different Client : 실행자가 로컬 플레이어가 아님(다른 플레이어의 캐릭터 등)
Server : 서버 소유의 객체. GameState가 해당함(Client의 GameState는 복제본이며 Role은 Simulated Proxy)
None : 소유자가 없는 객체, 예시)맵에 존재하는 상호작용 가능한 보물상자, 포션 등
Executing Machine = 실행 위치.
Server : 서버에서 실행
Client : 클라이언트에서 실행
Dropped : 요청 무시됨(실행되지 않음)
Server RPC

일반적으로 클라이언트에서 서버로 요청을 보내는 RPC 요청
1~3줄은 서버에서 서버RPC를 호출하는데 실행도 서버에서 실행된다. -> 맴버함수를 호출하는것과 동일하므로 비 권장사항.
클라이언트에서 자신 소유의 액터에서 서버 RPC를 호출하는 경우는 서버에서 실행된다.
클라이언트에서 자신 소유가 아닌 액터에서 서버 RPC를 호출하는 경우 Dropped, 요청이 무시된다
이를 이해하기위한 예시)
두명의 플레이어가 서로 동일한 캐릭터(클래스)를 가지고있고,
캐릭터는 서로 부딪혔을때(Overlap 또는 Hit Event) 상대에게 데미지를 입힌다고 하자.
데미지를 입히는 로직은 서버를 통해 전달이 될 것이다(ServerRPC를 통해 요청)
이때, 실제로 부딛히게 된다면 내 컴퓨터에서
1. 내 캐릭터가 충돌했을때
2. 남의 캐릭터가 충돌했을때
동일한 로직이 둘 다 실행이 될 것이다.
이때 ServerRPC 호출에서는 내 캐릭터에서 실행되는 경우는 Owning Connection이 Invoking Client이므로 정상실행되지만
남의 캐릭터에서 실행되는 호출에서는 Owning Connection이 Different Client이므로 Dropped된다.
중요한 부분은 결국 Owning Connection이 Invoking Client인, 로컬 플레이어 소유 액터의 요청만이 허용되는것이다.
Owning Connection이 Server인 경우는 GameState가 있고, None인 경우는 위에서 말한 보물상자같은 객체들.
클라이언트는 무시될 요청도 서버에게 보내기 때문에 불필요한 패킷 요청이 발생하게 된다. 이를 막기 위해서
if(IsLocallyControlled() == true) 등의 확인구문을 추가하는것이 매우 권장된다.
Client RPC

일반적으로 서버에서 클라이언트로 보내는 RPC요청.
4~7번째 줄은 이전과 동일하게 클라이언트에서 클라이언트 RPC를 보내는경우로 로컬 맴버함수를 호출하는것과 동일하다.
서버에서 Client소유의 액터에게 보내는 경우 정상적으로 실행된다.
액터의 소유권이 서버거나 없는 경우, 보낼 대상이 없으므로 서버에서 직접 실행된다.
ServerRPC때처럼 서버에서만 실행할 수 있도록
HasAuthority() == True인지를 확인하고 보내는것이 적절하다.
Net Multicast RPC

서버에서 서버와 대상과 관련된(Net Relevant) 모든 대상에게 보내는 요청.
Net Relevant는 일단 해당 객체와 관련되었는지를 결정하는 언리얼의 최적화 개념.
같은 레벨에 있더라도 보이지 않을 정도로 멀다던지 등의 경우 해당 플레이어는 요청 대상에서 제외되도록 하는 등의 방식이다.
Relevant에 대한 자세한 내용은 여기서 다루지 않고 나중에 다루므로 차후 후술예정.
일단은 해당 액터의 복제본을 가진 모든 클라이언트에서 실행되는 요청 정도로 이해하고 넘어간다.
여기서 "해당 액터의 복제본을 가진" 부분이 중요한데.
예를들어 모든 플레이어가 복제본을 가지는 GameState에서 Net Multicast RPC로 요청을 하게 된다면,
모든 플레이어는 요청을 받아 해당 함수를 실행할 것이다.
그런데 특정 플레이어에게만 복제본이 있는 PlayerController에서 Net Multicast요청을 보내게 된다면,
해당 PlayerController를 가진 플레이어만이 요청을 받게 될것이다.
Net Multicast RPC를 사용할때는 해당 부분을 고려하여 사용하여야 한다.
'개발 > 내일배움캠프' 카테고리의 다른 글
| Replicate 관련 속성들 (0) | 2026.06.17 |
|---|---|
| Replicates 설정과 NetLoadOnClient속성 (0) | 2026.06.16 |
| 언리얼 RPC 기초 정리 (0) | 2026.06.04 |
| 언리얼 네트워크 기초 정리 (0) | 2026.06.02 |
| 언리얼 멀티플레이어 개발전 설정들 (0) | 2026.06.01 |