본문 바로가기

언리얼러닝/C++스크립트게임개발

복제를 통한 클라이언트와 액터 변수 동기화 하기

Actor 변수중 Replicated 태그가 붙은 변수들은 그 값이 변경될때 연결된 리모트 프록시에 자동으로 변경된 값이 복제된다.

예를 들어, 캐릭터는 자신의 _HealthPoints값을 서버에서 복제한 다음 체력 포인트 바를 통해 변경된 내용을 다른 클라이언트에게 표시한다. 

우선 HealthBar위젯을 만들고 캐릭터의 체력을 제대로 표시하기 위해 복제 알림을 추가할 것이다.

PangaeaCharacter.h를 열고 _HealthPoints변수에 대한 UPROPERTY 매크로의 식별자로 Replicated 태그를 추가한다.

	UPROPERTY(Replicate)
	int _HealthPoints;

다음 받은 파일에는 다음과 같이 되어 있다.

UPROPERTY(Replicatedusing = OnHealthPointsChanged)
int _HealthPoints;

 

void GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const override;

PangaeaCharacter.cpp에 다음 코드를 추가한다.

#include <Net/UnrealNetwork.h>
void APangaeaCharacter::GetLifetimeReplicatedProps(TArray< FLifetimeProperty >& OutLifetimeProps) const
{
    Super::GetLifetimeReplicatedProps(OutLifetimeProps);
    DOREPLIFETIME(APangaeaCharacter, _HealthPoints);
}

APangaeaCharacter::APangaeaCharacter()
{
    PrimaryActorTick.bCanEverTick = true;
    bReplicates = true;
}

 

#include <Net/UnrealNetwork.h>를 포함시켜 DOREPLIFETIME() 매크로를 호출할수 있게 해준다.

GetLifetimeReplicatedProps() 함수는 슈퍼클래스의 오버라이드된 함수의 DOREPLIFETIME() 매크로를 호출해 _HealthPoints 변수를 복제한다.

APangaeaCharacter() 생성자에서 bReplicates = true; 설정해 캐릭터와 네트워크 변수가 복제되도록 한다.

이제 게임을 플레이 하는 동안 캐릭터의 _HealthPoints 변수가 서버에서 바뀌면 그 값이 복제돼 접속돼 있는 모든 클라이언트에서 그에 대응하는 캐릭터의 _HealthPoints 가 업데이트 된다.

그 다음으로 수행할 작업은 체력바를 만들어 캐릭터의 _HealthPoints 변수를 직접 보여주는 것이다.