인프런 커뮤니티 질문&답변

themoon007님의 프로필 이미지

작성한 질문수

이득우의 언리얼 프로그래밍 Part3 - 네트웍 멀티플레이 프레임웍의 이해

8강 RPC 기초

Multicast RPC가 연관성으로 돌아간다고 했는데 DistanceSquared가 적용 안되는것 같아요

23.11.27 21:02 작성

·

206

0

프로퍼티 복제에서는 Distance에 따라 연관성 따져서 통신 되고 안되고 했던 것 같은데요.

 

Multicast RPC는 멀리 떨어져도 통신 하던데 무엇을 잘못 한 건지 아니면

Multicast RPC는 그냥 AlwaysRelevant 모드인 연관성인지 궁금합니다.

답변 1

1

이득우님의 프로필 이미지
이득우
지식공유자

2023. 11. 27. 22:34

Multicast RPC는 기본적으로 연관성이 있는 클라이언트에게만 동작합니다.
혹시 멀리 떨어져도 통신을 한다는 것은 어떻게 테스트하셨을까요?

themoon007님의 프로필 이미지
themoon007
질문자

2023. 11. 28. 10:03

그냥 예전에 프로퍼티 방식으로 컬러변경 했던 방식으로

NetCullDistanceSquared = 4000000.f; //20m
적용해서 맵 끝으로 그냥 멀리 떨어져 봤었는데요.

 

좀 더 테스트 한 바로는 분수대에 오너쉽 설정하면

image

프로퍼티 방식 이던 MulticastRPC 방식 이던 똑같이 NetCullDistanceSquared = 4000000.f; 이 작동안되고 멀리 떨어져도 통신이 작동하고, 오너쉽 설정 코드 주석을 하면 멀리 떨어졌을 때 둘다 통신 안하는 듯 보입니다.

이득우님의 프로필 이미지
이득우
지식공유자

2023. 11. 28. 15:06

연관성은 단순히 거리로만 판단하지 않습니다.

IsNetRelevantFor 함수가 true로 리턴이 되어야 연관성이 있다고 판정됩니다. 참을 반환하는 기본 로직은 강의에서 자세히 설명하지만, 다음과 같습니다.
( 이는 가상 함수이기 때문에 오버라이드해서 게임에 맞게 재정의하는 것도 가능합니다. )

bool AActor::IsNetRelevantFor(const AActor* RealViewer, const AActor* ViewTarget, const FVector& SrcLocation) const
{
	if (bAlwaysRelevant || IsOwnedBy(ViewTarget) || IsOwnedBy(RealViewer) || this == ViewTarget || ViewTarget == GetInstigator())
	{
		return true;
	}
	else if (bNetUseOwnerRelevancy && Owner)
	{
		return Owner->IsNetRelevantFor(RealViewer, ViewTarget, SrcLocation);
	}
	else if (bOnlyRelevantToOwner)
	{
		return false;
	}
	else if (RootComponent && RootComponent->GetAttachParent() && RootComponent->GetAttachParent()->GetOwner() && (Cast<USkeletalMeshComponent>(RootComponent->GetAttachParent()) || (RootComponent->GetAttachParent()->GetOwner() == Owner)))
	{
		return RootComponent->GetAttachParent()->GetOwner()->IsNetRelevantFor(RealViewer, ViewTarget, SrcLocation);
	}
	else if(IsHidden() && (!RootComponent || !RootComponent->IsCollisionEnabled()))
	{
		return false;
	}

	if (!RootComponent)
	{
		UE_LOG(LogNet, Warning, TEXT("Actor %s / %s has no root component in AActor::IsNetRelevantFor. (Make bAlwaysRelevant=true?)"), *GetClass()->GetName(), *GetName() );
		return false;
	}

	return !GetDefault<AGameNetworkManager>()->bUseDistanceBasedRelevancy ||
			IsWithinNetRelevancyDistance(SrcLocation);
}

 

폰이나 플레이어 컨트롤러가 오너인경우 거리와 무관하게 true로 반환됩니다.
만일 그렇지 않다면 NetCullDistance 값을 사용해 거리로 측정합니다.
테스트하신 코드는 분수대 부모가 플레이어 컨트롤러니 항상 연관성을 가지게 되는데요, 이러면 게임 구성이 이상해지겠죠?

themoon007님의 프로필 이미지
themoon007
질문자

2023. 11. 28. 18:26

감사합니다. 강의에 답이 이미 있었네요...

 

그러면 일반 기타 액터인 분수대에 Server RPC/ Client RPC 라이트 변경 실습에서 Owner 설정한 것은 단순히 실습과 이해를 위해 그렇게 한 것이고, 보통 프로퍼티 리플리케이션이나 Multicast RPC로 하는 것이 일반적인 걸까요?