RPC(Remote Procedure Call) 이란?
- 원격 프로시저(함수) 호출의 약자
- 원격 컴퓨터이 있는 함수르 호출할 수 있도록 만든 통신 프로토콜
- 네트웍 멀티플레이에서 서버와 클라이언트간에 빠르게 행동을 명령하고 정보를 주고받는 데 사용
- 언리얼 엔진에서 클라이언트에서 서버로 통신하는 유일한 수단을 제공한다.
++)
오너십을 가지는 액터의 경우 클라이언트에서 서버로 명령을 내릴 수도 있음
https://docs.unrealengine.com/4.27/ko/InteractiveExperiences/Networking/Actors/RPCs/
RPC
네트워크를 통한 함수 리플리케이션 지정하기 입니다.
docs.unrealengine.com
Client RPC 개요
- 서버에서 클라이언트로 호출하는 RPC
- 이를 활용해 특정 클라이언트에게만 명령을 보낼 수 있음
- 서버에서 명령을 보낼 클라이언트의 커넥션을 소유한 액터를 사용해야 함.
(AActor::GetNetConnection)
++)
반드시 실행되어야 하는 로직이 아니면 Unreliable 키워드를 붙여 주는 것이 좋다.
구현부는 _Implemenation 을 붙여 구현한다.
Server RPC 개요
- 클라이언트에서 서버로 호출하는 RPC
- 언리얼 엔진 구조에서 유일하게 클라이언트가 서버의 함수를 호출 할 수 있는 기능.
- 서버쪽에서 클라이언트의 명령을 검증할 수 있는 함수를 구현할 수 있음.
- Cleint RPC 와 동일하게 서버와의 커넥션을 소유한 액터를 사용해야 함.
WithValidation -> 클라이언트가 보낸 명령이 악의적인 것인지 판단하기 위함
만약에 악의적인 것이라고 판단되면 바로 클라이언트의 접속을 끊고 클라이언트는 스탠드얼론이 된다.
NetMulticast RPC 개요
- 서버를 포함해 모든 플레이어에게 명령을 보내는 RPC
- 프로퍼티 리플리케이션과 유사하게 연관성 기반으로 동작함 ( 커넥션을 소유하지 않아도 동작)
- 프로퍼티 리플리케이션과 유사하지만 다른 용도로 사용한다.
RPC 선언에 관련된 키워드 정리
Reliable 키워드는 데이터 전송을 보장해주는데 내부적으로 보낸 패킷이 잘 도착했느지 확인하는 번거로운 작업을 거친다. 따라서 부하를 유발할 수 있기 때문에 꼭 필요한 때만 사용하는것이 좋음.
단일 머신으로 전송하는 RPC 의 경우에는 소유권을 가져야 한다.
++ GPT)
언리얼 엔진에서 RPC(원격 프로시저 호출)는 서로 다른 객체 간, 일반적으로 멀티플레이어 게임에서 서버와 클라이언트 간 통신에 사용됩니다. 단일 시스템에서 실행되도록 되어 있는 RPC를 호출하는 경우 소유권이 권한을 결정하므로 행위자에게 소유권이 있어야 합니다.
언리얼 엔진의 네트워킹 모델에서는 게임 세계의 각 액터가 소유 연결을 갖고 있습니다. 소유 연결은 네트워크를 통해 해당 행위자의 상태에 대한 변경 사항을 복제하는 일을 담당합니다. 소유한 연결만이 해당 행위자의 상태를 변경하고 해당 행위자에서 실행되는 RPC를 트리거할 수 있는 권한을 갖습니다. 행위자에게 소유권이 없다는 것은 자신의 상태에 대한 권한이 없다는 것을 의미합니다.
이 경우 소유권이 없는 행위자에 대해 RPC를 호출하면 행위자에게 RPC를 트리거할 권한이 없기 때문에 실행되지 않습니다. 이를 통해 권한 있는 행위자만 RPC를 실행하고 네트워크 전체에서 일관성을 유지할 수 있습니다. 따라서 단일 시스템에서 실행될 RPC를 호출하려는 경우 RPC를 호출하는 행위자가 RPC를 트리거하고 해당 상태를 변경할 수 있는 권한을 갖도록 소유권이 있는지 확인해야 합니다.
++)
오너를 폰으로 설정하거나 플레이어 컨트롤러로 설정하면 NetConnection 에 의해 오너십을 가지게 된다.
서버 rpc에서 검증에 실패하게 되면 즉시 접속을 끊는다. (스탠드얼론으로 돌아감)
클라이언트 RPC의 경우에는 해당 액터가 오너십을 가지지 않으면 서버에서 당분간 호출이 된다. 액터가 오너십을 가지게 되면 그때부터 클라이언트로 전송한다.
RPC 사용 시 주의할 점
https://docs.unrealengine.com/4.27/ko/InteractiveExperiences/Networking/Overview/
네트워크 개요
멀티플레이어용 네트워크 게임 구성하기 입니다.
docs.unrealengine.com
기본 복제 액터 체크리스트
복제된 액터를 생성하려면 다음 단계를 따르세요:
- 액터의 Replicated 설정을 True로 설정하세요.
- 복제된 액터를 이동해야 하는 경우 Replicates Movement를 True로 설정하세요.
- 복제된 액터를 생성하거나 삭제할 때는 반드시 서버에서 수행해야 합니다.
- 복제할 머신 간에 공유되어야 하는 변수를 설정합니다. 이는 일반적으로 게임플레이에 필수적인 변수에 적용됩니다.
- 언리얼 엔진의 사전 제작된 Movement Components는 복제용으로 이미 제작되어 있으므로 가능하면 사용하세요.
- 서버 권한 모델을 사용하는 경우 플레이어가 수행할 수 있는 새로운 작업이 서버 기능에 의해 트리거되는지 확인하세요.
네트워킹 팁
- RPC나 복제된 블루프린트 함수를 가능한 한 적게 사용하세요. 대신 RepNotify를 사용할 수 있다면 그렇게 해야 합니다.
- 멀티캐스트 기능은 세션에서 연결된 각 클라이언트에 대해 추가 네트워크 트래픽을 생성하므로 특히 아껴서 사용하십시오.
- 복제되지 않은 기능이 서버에서만 실행된다는 것을 보장할 수 있는 경우 서버 전용 논리가 반드시 서버 RPC에 포함될 필요는 없습니다.
- Reliable RPC를 플레이어 입력에 바인딩할 때는 주의하세요. 플레이어는 매우 빠르게 버튼을 반복적으로 누를 수 있으며 이는 Reliable RPC에 대한 대기열을 오버플로하게 됩니다. 플레이어가 이를 활성화할 수 있는 빈도를 제한하는 방법을 사용해야 합니다.
- 게임이 Tick과 같이 RPC 또는 복제된 함수를 매우 자주 호출하는 경우 이를 신뢰할 수 없게 만들어야 합니다.
- 일부 함수는 게임플레이 로직에 대한 응답으로 호출한 다음 RepNotify에 대한 응답으로 호출하여 클라이언트와 서버가 병렬 실행되도록 하는 방식으로 재활용할 수 있습니다.
- 액터의 네트워크 역할을 확인하여 역할이 맞는지 ROLE_Authority 여부를 확인할 수 있습니다. 이는 서버와 클라이언트 모두에서 활성화되는 함수의 실행을 필터링하는 데 유용한 방법입니다.
- IsLocallyControlled C++의 함수나 블루프린트의 Is Locally Controlled 함수를 사용하여 Pawn이 로컬로 제어되는지 확인할 수 있습니다 . 이는 소유 클라이언트와 관련이 있는지 여부에 따라 실행을 필터링하는 데 유용합니다.
- IsLocallyControlled Pawn이 생성 도중 컨트롤러를 할당하지 않을 수 있으므로 생성자 스크립트에서는 사용하지 마세요 .
RPC 사용 시 주의할 점 정리
요약하면, RPC와 속성 복제는 멀티플레이어 게임 개발에서 보완적인 역할을 합니다. RPC는 사용자 정의 네트워크 기능을 구현하고 원격 작업을 실행하기 위한 유연성을 제공하는 반면 속성 복제는 네트워크 전체에서 행위자 상태의 안정적인 동기화를 보장합니다.
RPC 종류에 따른 동작 Matrix
'언리얼엔진5 > [Part3] 이득우의 언리얼 프로그래밍' 카테고리의 다른 글
[이득우의 언리얼 프로그래밍 Part3 필기] 10. 캐릭터 공격 구현 개선 (0) | 2024.05.10 |
---|---|
[이득우의 언리얼 프로그래밍 Part3 필기] 9. 캐릭터 공격 구현 (0) | 2024.05.09 |
[이득우의 언리얼 프로그래밍 Part3 필기] 7. 액터 리플리케이션 로우레벨 플로우 (0) | 2024.05.06 |
[이득우의 언리얼 프로그래밍 Part3 필기] 6. 액터 리플리케이션 빈도와 연관성 (0) | 2024.04.30 |
[이득우의 언리얼 프로그래밍 Part3 필기] 5. 액터 리플리케이션 기초 (0) | 2024.04.29 |