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