● 게임 스테이트와 게임 모드의 차이
이전에 적은 글에서 게임 스테이트(Game State)와 게임 모드(Game Mode)에 대해서 적은 적이 있는데 사실 더 정확하게 적자면 둘은 네트워크 환경에 따라 역할이 나눠진다. 더 정확한 것은 언리얼 엔진 공식 문서를 참고하자. 서버가 없는 싱글 플레이인 스탠드 얼론에서는 클라이언트가 모두 가지고 있어서 둘의 역할이 비슷해진다.
- 게임 모드 : 게임 규칙을 정의한다. 네트워크 환경에서는 클라이언트가 가지고 있지 않으며 서버가 가지고 있다.
- 게임 스테이트 : 게임 모드를 기반으로 하여 현재 게임 상태를 관리한다. 서버가 가지고 있으며 각 클라이언트에 복제된다.
● 레플리케이션 (Replication)
어느 한쪽이 소유한 액터를 다른 클라이언트에 복제하는 것을 말한다. 이상적인 네트워크 환경에서는 서버에서 생성된 액터를 클라이언트에 복제한다.
복제된 액터는 원본 액터와 동일하게 작동해야 하지만 그렇다고 액터를 무조건 통째로 복사하는 것은 비효율적이다. 따라서 필요한 변수만 복제하도록 정할 수 있고 이것을 프로퍼티 레플리케이션(Property Replication)이라고 한다.
백물불여일견, 코드를 통한 예시로 보자
//BaseballPawn.h
UCLASS()
class BASEBALLGAME_API ABaseballPawn : public APawn
{
GENERATED_BODY()
public:
ABaseballPawn();
virtual void GetLifetimeReplicatedProps(TArray<class FLifetimeProperty>& OutLifetimeProps) const override;
private:
//자신 차례일때 주어지는 시간
UPROPERTY(VisibleAnywhere, meta = (AllowPrivateAccess = true))
float TurnTime;
//남은 시간
UPROPERTY(VisibleAnywhere, Replicated, meta = (AllowPrivateAccess = true))
float RemainingTime;
};
//BaseballPawn.cpp
ABaseballPawn::ABaseballPawn()
{
PrimaryActorTick.bCanEverTick = false;
bReplicates = true;
TurnTime = 0;
RemainingTime = 0;
}
void ABaseballPawn::GetLifetimeReplicatedProps(TArray<class FLifetimeProperty>& OutLifetimeProps) const
{
Super::GetLifetimeReplicatedProps(OutLifetimeProps);
DOREPLIFETIME(ABaseballPawn, RemainingTime);
}
- 레플레케이션 대상인 UPROPERTY는 Replicated 키워드가 필요하다.
- 레플리케이션할 액터는 bReplicates값을 true로 지정한다.
- GetLifetimeReplicatedProps함수를 오버라이드 해야 하며 해당 함수 내에서 DOREPLIFETIME메크로를 사용하여 복제 대상인 액터, 프로퍼티를 명시한다. (이 메크로는 Net/UnrealNetwork.h 헤더가 필요하다.)
'언리얼엔진 학습 및 과제' 카테고리의 다른 글
| 네트워크 채팅을 이용한 숫자야구 게임 (2) (0) | 2025.12.01 |
|---|---|
| 네트워크 채팅을 이용한 숫자야구 게임 (1) (0) | 2025.11.27 |
| 온라인 채팅 구현하기 (4) (0) | 2025.11.25 |
| 온라인 채팅 구현하기 (3) (0) | 2025.11.21 |
| 온라인 채팅 구현하기 (2) (0) | 2025.11.20 |