inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

8강 RPC 기초

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

335

themoon007

작성한 질문수 98

0

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

 

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

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

unreal-engine 네트워크 언리얼-c++

답변 1

1

이득우

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

0

themoon007

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

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

 

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

image

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

1

이득우

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

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 값을 사용해 거리로 측정합니다.
테스트하신 코드는 분수대 부모가 플레이어 컨트롤러니 항상 연관성을 가지게 되는데요, 이러면 게임 구성이 이상해지겠죠?

0

themoon007

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

 

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

5.6버전 Networking Insights 실행안됨 문제에 관하여

0

30

1

8강 중간, 분수대의 SetOwner 에 대해 궁금합니다.

0

77

2

플레이어(Actor) 로 (리슨)서버에서 생성 되나요?

0

99

2

2강) HandleBeginPlay 의 역활이 궁금합니다.

-1

72

2

3강 중간, 모드 로그로 찍을 시 스탠드얼론이 안찍힙니다.

1

76

2

CompressedFlag 질문

0

58

2

10강까지 머리 위 체력바가 표시가 안됩니다.

0

110

3

10강까지 머리 위 체력바가 표시가 안됩니다.

0

95

2

16:44 부분에서 질문이 있습니다.

0

104

2

12:50 NetMulticast RPC 커넥션 관려하여 질문이 있습니다.

0

121

2

github 3-5 파트 프로젝트에서 컴파일 에러가 발생합니다.

0

116

3

언리얼 인사이트 5.6버전 networking insights 가 뜨지 않습니다.

0

164

3

Insight 사용이 안되어서 문의 드립니다!

0

131

2

하위 레벨...?? High Level 말씀하신거죠..??

0

147

1

CompressedFlags를 이용한 InputThrottle, InputSteering 전달 방법 질문

0

191

1

조건식 프로퍼티 리플리케이션 질문

0

144

2

ArenaBattle에 Log추가하는 곳에 에러가 나타나 질문 드립니다.

0

160

2

7강에서 DORM_Initial 안됨

0

128

3

안녕하세요 강의 내용 정리에 관련해서 질문있어요

0

131

2

캐릭터 클래스의 mesh 관련

0

133

2

3파트 6강 분수대 로테이트에 문제가 생겼습니다.

0

131

3

클라이언트의 오너십 설정에 대해서 궁금합니다.

0

201

3

프로퍼티 리플리케이트 동기화 보장 개념.

0

225

2

결국엔 액터 기본함수들은 어디든 똑같이 일단 실행되는건가요?

0

93

2