Unreal Engine 4 프로그래밍 c++/Online Multiplayer

Unreal ReplicatedUsing c++ 기초2

코닥쿠 2023. 3. 15. 23:58
반응형

이번에는 ReplicatedUsing으로 알아보자면, 기존 Replicated에서 Multicast가 기본장착이라고 생각하면 쉽다.

그러면 그에 상응하는 Function이나 다른 맞는 매크로가 있는건 당연히 이해할것이다.

 

코드를 보면서 설명해드리겠습니다.

.h

UPROPERTY(ReplicatedUsing = OnRep_TestFunction)
bool bTestValue = false;

UFUNCTION(Server, Reliable, WithValidation, BlueprintCallable)
void Server_TestFunction(bool bActive);

UFUNCTION()
void OnRep_TestFunction();

먼저 해당 Replicated시킬 변수를 선언할변수에서의 프로퍼티를 ReplicatedUsing이라고 지정을 해준다.

그다음에는 당연히 호출하기위한 함수를 생성하고 지정해줘야한다. 

그리고 함수생성당시 앞에 OnRep를 붙어줘야한다. (앞에 RPC같은 같은 개념이다. 구분짓기 위해서 이며 OnReplicated의 줌말같은느낌이다. <당연히 매개변수는 추가를 못한다.>)

그리고 리플리케이티드된 변수를 변경하기 위해 Server함수를 생성해줍니다.

void ACharacterBase::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
{
	DOREPLIFETIME(ACharacterBase, bTestValue);
}

void ACharacterBase::Server_TestFunction_Implementation(bool bActive)
{
	bTestValue = bActive;

	OnRep_TestFunction();	//추가해준 이유//
}
bool ACharacterBase::Server_TestFunction_Validate(bool bActive)
{
	return true;
}

void ACharacterBase::OnRep_TestFunction()
{
	if (bTestValue)
	{
		UAnimInstance* AnimInstance = GetMesh()->GetAnimInstance();
		if (!AnimInstance || !RollMt) return;

		AnimValues.bRoll = true;

		const char* SectionList[] = { "Forward", "Left", "Right", "Back_L", "Back_R", "Dodge" };

		AnimInstance->Montage_Play(RollMt);
		AnimInstance->Montage_JumpToSection(FName(SectionList[0]), RollMt);

		GEngine->AddOnScreenDebugMessage(-1, 3.f, FColor::White, __FUNCTION__);
	}
}

이런식으로 Server함수에서는 값만 변경해주며 해당 변경된 함수에서는 OnRep 지정자가 호출되게 되있다.

하지만 제가 주석으로 추가해준 OnRep함수는 Listen Server(Host방식)이기에 저런식으로 호출해줍니다.

만약 Host방식이 아닌 데디케이티드 방식의 쓸경우에는 추가해줄 필요가 없지만 Host방식에서의 호출은 Server함수에도 호출을 해줘야 해당 움직임들의 호출이 완전히 이루어집니다.

(아래 영상에서 왜 그런지를 보여줍니다.)

https://www.youtube.com/watch?v=Ff53PNiZTJo

 

반응형