매 초마다 x방향으로 Speed만큼 이동
#include "MovingPlatforms.h"
AMovingPlatforms::AMovingPlatforms()
{
PrimaryActorTick.bCanEverTick = true;
SetMobility(EComponentMobility::Movable);
}
void AMovingPlatforms::BeginPlay()
{
Super::BeginPlay();
if (HasAuthority()) {
SetReplicates(true);
SetReplicateMovement(true);
}
}
void AMovingPlatforms::Tick(float dt)
{
Super::Tick(dt);
if (HasAuthority()) {
FVector Location = GetActorLocation();
Location += FVector(Speed * dt, 0, 0);
SetActorLocation(Location);
}
}
Replicates
- Replicates를 적용하지 않으면, 클라이언트에서는 입력이 서버에게 전달되고 서버에서는 큐브의 이동경로에 큐브가 없어서 클라이언트에서 보면 큐브를 통과하는 것처럼 보인다.
- 서버에서의 큐브 위치는 클라이언트로 전달되어 보이는 형체는 그대로지만, 마치 투명한 큐브가 움직이는 것처럼 막는다.
서버대신 클라이언트에서 큐브 위치를 업데이트
#include "MovingPlatforms.h"
void AMovingPlatforms::Tick(float dt)
{
Super::Tick(dt);
if (!HasAuthority()) {
FVector Location = GetActorLocation();
Location += FVector(Speed * dt, 0, 0);
SetActorLocation(Location);
}
}
- 클라이언트가 큐브 위치를 업데이트하면 서버에 전달하는 것이 아니기 때문에 클라이언트에서는 위치가 업데이트 되지만 서버에서는 업데이트가 되지 않는다.
- 이때, 서버에서의 큐브 위치는 처음 위치 고정이기 때문에, 클라이언트에서도 처음 큐브 위치를 통과하지 못한다.
결론
서버에서의 위치 업데이트는 항상 신뢰가능하고, 정확한 위치 이동이 가능하다.