[UE] 권한 및 복제

KANTAM·2022년 7월 29일
0

Unreal Engine | Server

목록 보기
1/2
post-thumbnail

권한 및 복제

  • 초마다 x방향으로 Speed만큼 이동하는 발판
#include "MovingPlatform.h"

AMovingPlatform::AMovingPlatform()
{
	PrimaryActorTick.bCanEverTick = true;

	SetMobility(EComponentMobility::Movable);
}

void AMovingPlatform::BeginPlay()
{
	Super::BeginPlay();

	if (HasAuthority())
	{
		SetReplicates(true);
		SetReplicateMovement(true);
	}
}

void AMovingPlatform::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);

	// HasAuthority : 자신이 서버인지 반환한다. 서버(ture) 
	if (HasAuthority())
	{
		FVector Location = GetActorLocation();
		Location += FVector(Speed * DeltaTime, 0.0f, 0.0f);
		SetActorLocation(Location);
	}
}

Replicate가 없는 경우

서버

  • 서버에서는 정상적으로 큐브가 움직이며 큐브를 통과할 수 없다.

클라이언트

  • 클라이언트에서는 큐브가 움직이지 않으며 큐브를 통과할 수 있고, 보이지 않는 큐브(서버에 있는)를 통과할 수 없다.

Replicate를 젹용시키지 않았을 때, 클라이언트에서는 입력이 서버에게 전해지고 서버에서는 이동경로 사이에 큐브가 없으므로 클라이언트에서는 큐브를 통과하는 것처럼 보인다.
또한, 서버의 큐브의 위치는 클라이언트에게도 넘겨지므로 클라이언트에서는 투명한 큐브가 있는 것처럼 움직임이 막힌다.


클라이언트에서 큐브의 위치를 업데이트 한다면

void AMovingPlatform::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);

	// HasAuthority : 자신이 서버인지 반환한다. 서버(ture) 
	if (!HasAuthority())	// 클라이언트에서 위치를 업데이트하도록 !를 붙임
	{
		FVector Location = GetActorLocation();
		Location += FVector(Speed * DeltaTime, 0.0f, 0.0f);
		SetActorLocation(Location);
	}
}

서버

  • 서버에서는 큐브가 처음 위치에 고정된다.

클라이언트

  • 클라이언트에서는 큐브가 움직이지만 통과할 수 있고, 처음 큐브가 있던 위치를 통과할 수 없다.

클라이언트가 위치를 업데이트한 경우 서버에 다시 알릴 수 없기 때문에 서버에서는 큐브의 위치가 처음 위치로 고정되며 이 위치가 클라이언트에 반영되어 클라이언트는 처음 큐브가 있던 위치를 통과할 수 없다. (서버에서 큐브의 위치가 없데이트 되지 않기때문에)


결론

서버가 유지하는 위치가 항상 정확하며, 서버가 위치를 업데이트하는 경우에만 차이가 발생한다.
중요한건 서버가 말하는 것이 진실이다.(authoritative)

0개의 댓글