[UE5] RPC

kkado·2024년 6월 16일
0

UE5

목록 보기
44/63
post-thumbnail

https://dev.epicgames.com/documentation/ko-kr/unreal-engine/rpcs-in-unreal-engine?application_version=5.1

RPC (Remote Procedure Call)은 함수를 호출하는 기기와 다른 기기에서 실행할 수 있는 원격 실행 함수이다.

RPC는 멀티플레이어 환경에서 서버/클라이언트 간의 전송에 유용하게 사용된다.

어떤 액터 프로퍼티를 복제(Replicate) 할 때는 항상 서버에서 클라이언트 방향으로 이루어졌는데, 만약 클라이언트의 동작이 서버에도 전달되어야 하는 경우에는 RPC를 사용한다.

사용

UFUNCTION(Client)
void ClientRPCFunction();

UFUNCTION(Server)
void ServerRPCFunction();

UFUNCTION(NetMulticast)
void MulticastRPCFunction();

UFUNCTION 프로퍼티에 이 함수가 어디서 실행될 것인지를 명시해 주면 된다.

그리고 명시된 것과 동일하게 함수명에 Prefix를 붙여주는 것이 보편적이다. 함수명만 보고도 이 함수가 어디서 실행되는지 알 수 있어야 좋기 때문이다.

서버에서 호출된 RPC

액터 소유No ReplicateNetMulticastServerClient
클라이언트서버서버와 모든 클라이언트서버액터의 Owning 클라이언트
서버서버서버와 모든 클라이언트서버서버
None서버서버와 모든 클라이언트서버서버

클라이언트에서 호출된 RPC

액터 소유No ReplicateNetMulticastServerClient
호출 클라이언트호출 클라이언트호출 클라이언트서버호출 클라이언트
다른 클라이언트호출 클라이언트호출 클라이언트드랍호출 클라이언트
서버호출 클라이언트호출 클라이언트드랍호출 클라이언트
None호출 클라이언트호출 클라이언트드랍호출 클라이언트

클라이언트에서 서버로 전송하려면 Server UFUNCTION을 명시하여 replicate 해 주면 된다.

Reliability

기본적으로 RPC는 비신뢰성이지만, UFUNCTION 프로퍼티에 추가적으로 Reliable 을 붙여 주면 이 RPC가 실행될 것임을 보장할 수 있다.


예시

멀티플레이어 게임에서 조준하는 기능을 만드려고 할 때 조준 애니메이션은 나뿐 아니라 세션에 참여하는 모든 클라이언트에서 볼 수 있어야 한다. 즉 클라이언트의 함수 호출이 서버에서 실행되어 다른 클라이언트의 프록시들에게 replicate 되어야한다.

애니메이션 전환을 위한 bAiming 변수를 만들고 이것을 인풋에 따라 변경하는 함수인 SetAiming을 만들었다. 하지만 이것만으로는 이 동작을 수행할 수 없다. bAiming 이 복제되지 않기 때문이다.

다음과 같은 절차로 RPC를 사용할 수 있다.

  • bAiming 변수에 UPROPERTY(Replicated) 를 명시하여 복제 변수로 만든다.
  • GetLifetimeReplicatedProps() 함수에서 DOREPLIFETIME 매크로를 이용해 등록한다.
  • 서버에서 실행될 ServerSetAiming() 함수를 만들고 이 함수를 UFUNCTION(Server, Reliable) 로 명시한다.
  • RPC의 구현부인 ServerSetAiming_Implementation() 함수에서 SetAiming과 같은 작업을 실행한다.
void UCombatComponent::SetAiming(bool bIsAiming)
{
	bAiming = bIsAiming;
	ServerSetAiming(bIsAiming);
}

void UCombatComponent::ServerSetAiming_Implementation(bool bIsAiming)
{
	bAiming = bIsAiming;
}

SetAiming() 에서 bAiming = bIsAiming 부분은 필요없긴 하지만 서버를 거쳐 값을 변경하고 그 값이 복제되면 애니메이션이 전환되는 것보다는 즉시 애니메이션 전환이 이뤄지는게 더 매끄러우므로 바로 값을 바꿔주었다.

만약 SetAiming() 함수가 클라이언트에서 호출된다면 ServerSetAiming 함수가 서버에서 실행되고 따라서 모든 클라이언트에 있는 내 Simulated proxy의 애니메이션이 전환된다.

profile
베이비 게임 개발자

0개의 댓글