Post

언리얼 호스트 서버 열기 2

언리얼 Listen서버 내 데이터 통신 주고받기

언리얼 호스트 서버 열기 2

서버 내 연산 처리


1. 서버 권한 검증 (HasAuthority)

네트워크 환경에서 중요한 연산(데미지 계산, 아이템 획득 등)은 반드시 서버에서만 실행되어야 합니다.

  • HasAuthority(): 현재 이 코드를 실행하는 주체가 서버(권한자)인지 확인하는 함수입니다.
  • 역할: 클라이언트의 임의 변조를 막고, 서버에서 안전하게 연산한 결과만을 클라이언트에 동기화(전달)하도록 강제합니다.
1
2
3
4
5
if (GetOwner()->HasAuthority())
{
    // 서버에서만 실행되는 안전한 로직 (예: 체력 감소, 점수 획득)
}


2. 액터 복제 활성화 (기본 세팅)

액터의 변수나 움직임이 네트워크를 통해 클라이언트들에게 전달되려면, 생성자에서 복제 기능을 켜주어야 합니다.

  • bReplicates = true;: 이 액터를 네트워크를 통해 복제하겠다고 선언합니다.
  • SetReplicateMovement(true);: 액터의 위치(Location), 회전(Rotation), 속도(Velocity) 등 움직임 정보도 자동으로 서버에서 클라이언트로 동기화합니다.
1
2
3
4
5
6
7
8
9
AMyActor::AMyActor()
{
    PrimaryActorTick.bCanEverTick = true;

    // 네트워크 복제 활성화
    bReplicates = true;
    SetReplicateMovement(true); 
}


3. 멤버 변수 복제 (Replicated)

특정 변수의 값이 서버에서 변경되었을 때, 이를 클라이언트들에게 자동으로 전송(동기화)하고 싶다면 2가지 작업이 필요합니다.

3-1. UPROPERTY 매크로 설정

변수 선언 위에 Replicated 지정자를 추가합니다. 이 변수는 서버에서만 연산 및 수정되어야 하며, 변경된 값이 클라이언트로 단방향 복제됩니다.

1
2
3
4
protected:
    UPROPERTY(Replicated)
    int32 Health;

3-2. GetLifetimeReplicatedProps 오버라이드 및 구현

Replicated로 지정된 변수는 반드시 이 함수를 통해 등록해 주어야 실제로 복제가 일어납니다.

  • 헤더 파일 (.h) 선언 ```cpp virtual void GetLifetimeReplicatedProps(TArray& OutLifetimeProps) const override;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

* **소스 파일 (`.cpp`) 구현**
* `Net/UnrealNetwork.h` 헤더를 반드시 포함해야 합니다.
* `DOREPLIFETIME(클래스이름, 변수이름);` 매크로를 사용해 등록합니다.



```cpp
#include "Net/UnrealNetwork.h" // 매크로 사용을 위해 필수 포함!

void AMyActor::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
{
    Super::GetLifetimeReplicatedProps(OutLifetimeProps);

    // Health 변수를 복제 대상으로 등록
    DOREPLIFETIME(AMyActor, Health);
}


정리

“생성자에서 bReplicates를 켜고, 변수에 Replicated를 붙인 뒤, GetLifetimeReplicatedPropsDOREPLIFETIME으로 등록하면, 서버(HasAuthority)에서 바꾼 변수 값이 클라이언트에게 안전하게 전달된다!”

This post is licensed under CC BY 4.0 by the author.