본문 바로가기

멀티플레이 공부

멀티플레이 공부(Remote Procedure Call, 액터 소유권, WithValidation, UnReliable, Reliable)

RPC(Remote Procedure Call)

지금까지 함수를 호출하는 PC와 실행하는 PC가 같았다.

즉, 로컬 PC에서 함수를 호출하고 로컬 PC에서 함수를 실행했다.

 

RPC는 간단하게 호출하는 PC와 실행하는 PC가 달라도 되도록 해주는 통신 기법 이다.

언리얼에서는 게임에 큰 영향을 주지 않는 일시적인 효과들에 RPC를 사용하는 편이다.

주로 코스메틱(사운드, 파티클 등)에 사용한다.

  1. 어디에서 호출하는가
    • 서버에서 호출하는가 / 클라이언트에서 호출하는가
  2.  해당 RPC 함수가 어느 액터에 정의되어 있고, 그 액터의 소유권은 누구인가
    • 호출한 클라이언트가 소유(Owner)인가
    • 서버가 소유인가
    • 소유자 없음(미소유)인가
  3. 결국 어디에서 실행되는가(최종 결과)
    • 서버에서 실행
    • 특정 클라이언트에서 실행
    • 모든 클라이언트에서 실행
    • 드랍(무시)

이 세 요소(호출 주체, 함수가 정의된 액터의 소유권, RPC 타입)가 합쳐져서 최종 실행 위치를 결정한다.

액터 소유권

네트워크 멀티플레이가 적용되려면 액터는 서버에서 스폰되고 bReplicated가 true여야 한다.

서버에서 스폰 후 SetOwner(PlayerController) 함수를 호출 해야 클라이언트 소유 액터가 된다.

 

PlayerController 가 Local PlayerController와 같다면 클라리언트 소유 액터, 다르다면 다른 클라이언트의 소유 액터

서버에서 스폰 됐지만 SetOwner() 함수 호출이 없다면 서버 소유 액터다.

 

NetMulticast와 Server, Client는 UFUNCTION() 매크로와 함께 사용되는 키워드다.

이 키워드는 해당 원격 PC에서 RPC를 실행시켜 달라는 요청 을 뜻한다.

 

NetMulticast : 서버를 포함한 모든 클라이언트에서 해당 RPC를 실행시켜달라.

Server : 서버에서 해당 RPC를 실행시켜달라.

Client : 클라이언트에서 해당 RPC를 실행시켜달라.

자주 사용되는 케이스

1. RPC가 클라이언트에서 호출되고 서버에서 실행되어야 하는 경우에는 Server 키워드를 사용해야 한다.

  • ClientConnection이 소유하고 있는 액터(Client-Owned)에서 RPC가 호출되어야 한다.
  • _Validate() 함수에서 RPC를 실행할지 말지 결정한다.

2. RPC가 서버와 모든 클라이언트에서 실행되어야 하는 경우에는 NetMulticast 키워드를 사용해야 한다.

  • 서버에서 호출해야 한다.
  • 부하가 심하므로, 빈번하게 호출되게끔 코드를 작성하는 건 권장되지 않는다.
    • ex) Tick() 함수 내에서 NetMulticast RPC 호출.

3. RPC가 서버에서 호출되고 클라이언트에서 실행되어야 하는 경우에는 Client 키워드를 사용해야 한다.

  • 서버에서 호출해야 한다.

WithValidation

UFUNCTION() 매크로와 함께 사용되는 키워드 이다.

 

WithValidation은 서버에서 실행되는 RPC의 경우에 해당 키워드를 작성하는 것이 권장된다.

 

WithValidation 키워드가 붙은 RPC를 구현 할때는 _Implementation() 함수와 _Validate() 함수로 나뉘어 진다.

_Validate() 함수는 해당 RPC가 서버에서 실제로 실행할지 말지 결정한다.

서버 실행 로직은 무조건적으로 신뢰되기 때문에, 위변조를 막기 위한 방어막 역할을 한다.

Unreliable vs Reliable

UFUNCTION() 매크로와 함께 사용되는 키워드 이다.

 

RPC는 기본적으로 Unreliable 키워드를 기준으로 동작합니다.(아무것도 안쓰면 Unreliable)

Unreliable은 원격 PC에서 무조건 실행되리라는 보장이 없습니다.

반면, 원격 PC에서 무조건 실행되어야 하는 로직이라면 Reliable 키워드를 작성합니다.

 

Unreliable의 활용 예시

  • 코스메틱(이펙트, 사운드 등)처럼 게임에 큰 영향이 없는 로직.

Reliable의 활용 예시

  • 충돌, 데미지, 스폰처럼 게임에 큰 영향을 끼치는 로직.