[ UE ] Authority & Replication

LeeTaes·2024년 3월 10일

UE-MultiPlayer

목록 보기
3/5

권한(Authority)과 복제(Replication)

권한(Authority)

  • Authority는 특정한 객체(예: 캐릭터, 액터)에 대한 행동 및 결정 권한을 나타냅니다.
  • 멀티플레이어 환경에서, 클라이언트와 서버 간의 통신이 필요한데, 이때 서버가 해당 객체에 대한 권한을 갖게 됩니다.
  • 주로 서버는 게임 세계의 상태를 제어하고, 클라이언트는 사용자 입력 및 상호작용을 처리합니다.
  • ex. 캐릭터의 위치는 서버에서 결정되고 클라이언트에게 동기화됩니다.

복제(Replication)

  • Replication은 게임 객체의 상태 및 행동을 서버와 클라이언트 간에 동기화하는 프로세스를 나타냅니다.
  • 클라이언트는 서버에서 발생한 중요한 이벤트 및 상태를 수신하여 로컬에 적용하고, 서버는 클라이언트에게 필요한 정보를 전송하여 동기화를 유지합니다.
    Replication을 통해 멀티플레이어 게임에서 모든 플레이어가 동일한 게임 세계를 공유하며, 서로 다른 클라이언트에서 발생한 변경 사항이 모두 반영됩니다.

실습] 권한과 복제 확인하기

HasAuthority() : 자신이 서버인지 아닌지를 판별해주는 함수 (서버 : true)


  1. 같은 액터를 서버에서만 움직이고 서버와 클라이언트의 상태 확인해보기
  • 실습을 위해 움직이는 액터를 생성해줍니다.
    (부모 클래스 : Actor)
#include "MovingPlatforms.h"

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

}

void AMovingPlatforms::BeginPlay()
{
	Super::BeginPlay();
}

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

	// 자신이 서버인 경우라면?
	if (HasAuthority())
	{
		// 액터의 위치를 업데이트
		FVector Location = GetActorLocation();
		Location += FVector(Speed * DeltaTime, 0, 0);
		SetActorLocation(Location);
	}
}

  • 좌측은 클라이언트 / 우측은 서버의 화면입니다.
  • 서버의 화면에서만 정상적으로 액터의 위치가 업데이트 되는 것을 확인할 수 있습니다.

현 상황에서 클라이언트가 화면의 물체와 충돌한다면?

  • 플레이어는 물체를 통과하게 됩니다.

  1. 같은 액터를 클라이언트에서만 움직이고 서버와 클라이언트의 상태 확인
#include "MovingPlatforms.h"

AMovingPlatforms::AMovingPlatforms()
{
	PrimaryActorTick.bCanEverTick = true;
}

void AMovingPlatforms::BeginPlay()
{
	Super::BeginPlay();
}

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

	// 자신이 서버가 아닌 경우라면?
	if (!HasAuthority())
	{
		// 위치를 업데이트
		FVector Location = GetActorLocation();
		Location += FVector(Speed * DeltaTime, 0, 0);
		SetActorLocation(Location);
	}
}

  • 좌측은 클라이언트 / 우측은 서버의 화면입니다.
  • 클라이언트의 화면에서만 액터의 위치가 업데이트 되는 것을 확인할 수 있습니다.

현 상황에서 클라이언트가 화면의 물체와 충돌한다면?

  • 플레이어는 물체를 통과하게 됩니다.

  1. 같은 액터를 서버에서만 움직이고, 서버에서 복제 하겠다고 선언한 경우 결과 확인
#include "MovingPlatforms.h"

AMovingPlatforms::AMovingPlatforms()
{
	PrimaryActorTick.bCanEverTick = true;
}

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

	// 자신이 서버인 경우라면?
	if (HasAuthority())
	{
		// 현재 액터를 복제하기
		SetReplicates(true);
		// 현재 액터의 움직임을 복제하기
		SetReplicateMovement(true);
	}
}

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

	// 자신이 서버인 경우라면?
	if (HasAuthority())
	{
    	// 위치를 업데이트
		FVector Location = GetActorLocation();
		Location += FVector(Speed * DeltaTime, 0, 0);
		SetActorLocation(Location);
	}
}

  • 서버에서만 액터를 이동시켰지만 Replication을 통해 클라이언트와 동기화되어 클라이언트 측에서도 액터가 이동하는 것을 확인할 수 있습니다.

현 상황에서 클라이언트가 화면의 물체와 충돌한다면?

  • 실제 액터가 있는 위치(서버 기준)과 동일하기 때문에 물체와 충돌하게 됩니다.

서버의 역할

권한 및 게임 상태 관리

  • 서버는 게임의 핵심 권한을 가지고 있어 중요한 게임 로직 및 상태를 관리합니다.
  • 게임의 핵심 요소들은 서버에서 관리되며 클라이언트는 서버로부터 이 정보를 수신하여 로컬에 반영합니다.

보안 및 부정행위 방지

  • 서버는 게임의 보안을 담당하며, 부정한 활동이나 해킹 시도를 탐지하고 방지할 수 있습니다.
  • 중요한 게임 로직이 서버에 있기 때문에 클라이언트에서의 부정한 조작이 어려워집니다.

일관성 유지

  • 서버는 모든 클라이언트 간에 게임 상태의 일관성을 유지하는 역할을 합니다.
profile
클라이언트 프로그래머 지망생

0개의 댓글