UE5

UE 멀티플레이 변수 Replicate

우대비 2023. 5. 2. 16:06
반응형
#include <Net/UnrealNetwork.h>

 

.header

UPROPERTY(Replicated, EditAnywhere)
    uint32 JumpCount;
    
virtual void GetLifetimeReplicatedProps
	(TArray<FLifetimeProperty>& OutLifetimeProps)const;

void Jump()override;

 

.cpp

void ATP_ThirdPersonCharacter::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
{
	Super::GetLifetimeReplicatedProps(OutLifetimeProps);

	DOREPLIFETIME(ATP_ThirdPersonCharacter, JumpCount);
}

void ATP_ThirdPersonCharacter::Jump()
{
	Super::Jump();

	JumpCount++;

	if (GetRemoteRole() == ROLE_SimulatedProxy)
	{
		UKismetSystemLibrary::PrintString(GetWorld(), FString::Printf(TEXT("%s Calles Jump %d Times"), *GetName(), JumpCount));
	}
}

DOREPLIFETIME으로 JumpCount를 모든 클라이언트에 복제함

RemoteRole이 Simulated라는 건 함수를 실행하고 있는게 서버라는 의미

 

서버에서 점프 하면 PrintString함수가 정상 실행되고

클라이언트에서 실행하면 실행 안됨

 

GetLifetimeReplicatedProps함수 안에서 DOREPLIFETIME으로 복사할 변수를 지정해주면

그 변수의 값이 변할때마다 네트워크가 모든 클라이언트에 변경된 값을 전달해줌

 

여기서 중요한게 두 Player의 JumpCount 값이 같아지는것이 아니라 

Player1의 JumpCount를 Player2가 알게되는것 뿐

 

 

 

롤/리모트 롤 반전

롤과 리모트 롤은 이 값을 누가 조사하는가에 따라 반대가 될 수 있습니다.

예를 들어 서버에서 환경설정이 이렇게 되어있다면:

  • Role == ROLE_Authority
  • RemoteRole == ROLE_SimulatedProxy

클라이언트에서는 이렇게 보일 것입니다:

  • Role == ROLE_SimulatedProxy
  • RemoteRole == ROLE_Authority

이는 정상인데, 액터를 담당하는 것은 서버이며,

이 액터를 클라이언트에 리플리케이트하기 때문입니다.

클라이언트는 그저 업데이트를 받아 그 업데이트 사이 액터에 시뮬레이션을 적용할 뿐입니다.

https://docs.unrealengine.com/4.26/ko/InteractiveExperiences/Networking/Actors/Roles/

 

액터 롤 및 리모트 롤

액터 오브젝트 리플리케이션의 여러가지 부분에 대한 것입니다.

docs.unrealengine.com

 

반응형
LIST