Unreal

Unreal5 리슨 서버와 데디케이트 서버

yoosorang 2025. 3. 12. 20:45

1️⃣ 개요

언리얼이 제공하는 서버인 데디케이트 서버와 리슨 서버에 대해 알아보고자 한다.

먼저 데디케이트 서버와 리슨 서버는

한국의 온라인 게임이 사용하는 Persistent 서버(항상 운영되는 상태)와 다르게 콜솔 기반 게임에 적합하다.

상용 게임에 이 서버들을 사용하기는 어렵다고 볼 수 있지만 배움의 차움에서 이를 알아보고자 한다.

 

2️⃣ 리슨 서버

🔹액터

액터의 경우 리플리케이트만 켜주면 공유된다.

❓스태틱 메쉬는 그냥 뷰포트에 배치되면 공유되는데...

스태틱 메쉬
월드에 배치된 오브젝트는 기본적으로 클라이언트와 서버가 동일한 장면을 렌더링함하여
리플리케이션을 켜지 않아도 보인다.

블루프린트(동적 객체)
동적인 객체나 블루프린트는 bReplicates를 활성화해야 클라이언트와 서버 간에 상태가 동기화되어서 
클라이언트에서 제대로 보인다.

🔹액터가 플레이어와 부딪혔을 때 게임 종료 흐름

액터 → 게임 모드 → 플레이어 컨트롤러 → 위젯

액터에서 게임 모드의 이벤트 호출

게임 모드에서 모든 플레이어 컨트롤러의 이벤트 호출

각각의 플레이어 컨트롤러에서 위젯을 화면에 Add

이때 플레이어 컨트롤러의 리플리케이트 설정해줘야 한다!

위젯에서 텍스트 설정

 

3️⃣ 데디케이트 서버

1. Connect Map에서 Connect 위젯 버튼 클릭했을 때의 흐름

위젯 → 플레이어 컨트롤러 → 게임 모드

위젯 블루프린트

대기 Map에서 위젯 버튼 클릭 시 레벨 이동

위젯 블루프린트

이동과 함께 플레이어 컨트롤러에 로그인 알림

플레이어 컨트롤러 블루프린트

플레이어 컨트롤러는 게임 모드에 알림

게임 모드 블루프린트

플레이어가 위젯 버튼을 눌러 로그인 했다는 알림은 받았지만 실행할 노드가 없다.

 

한편 게임 모드는 플레이어가 들어올 때마다 플레이어 수를 기록하고 Connect Map에 들어온 플레이어가 2명 이상이라면

심리스 트래블 사용을 켠 상태로 servertravel MazeMap을 호출해

모든 플레이어와 함께 MazeMap으로 이동하게 해준다.

2. 맵&모드 및 패키징 설정

3. 에디터 버전 변경

깃허브로 받아서 빌드한 에디터로 버전 변경

4. 프로젝트 빌드

sln 파일을 열고

development editor로 빌드 한번 → deveopment server로 빌드 한번하면

아래처럼 Binaries에 파일이 생성된다.

Binaries에 생성된 건 서버 실행파일에서 끝나지 않고

콘텐츠 패키징을 통해 콘텐츠 실행 파일을 따로 생성해주어야 한다.

5. 프로젝트 패키징

6. 서버 실행

데디케이티드 서버 cmd를 사용하여 실행

(-log를 안 적어주면 cmd가 그냥 꺼져서 확인할 수 없다.)

에디터에서 standalone으로 플레이어 수 지정해주면 테스트가 가능하다.

 

4️⃣ 네트워크 관련 함수

🔹HasAuthority

if (HasAuthority())
{
    if (GetWorld()->IsNetMode(NM_ListenServer))
    {
        UE_LOG(LogTemp, Warning, TEXT("호스트 (서버 + 본인 플레이)"));
    }
    else if (GetWorld()->IsNetMode(NM_DedicatedServer))
    {
        UE_LOG(LogTemp, Warning, TEXT("전용 서버"));
    }
}
else
{
    UE_LOG(LogTemp, Warning, TEXT("클라이언트"));
}
구분 HasAuthority() IsLocalController() 설명
Dedicated Server true false (플레이어 없음) 오로지 서버 역할만
Host (Listen Server) true true 서버이면서 본인도 플레이어
Remote Client false true 클라이언트, 본인 플레이어
Other Client Actor false false 다른 클라이언트에서 복제된 Actor
❓복제된 Actor (Replicated Actor)
서버의 정보를 바탕으로 클라이언트에 자동으로 만들어진 Actor

예를 들어
A라는 플레이어가 총알을 발사했다면
서버가 총알 Actor를 생성하고 다른 클라이언트(플레이어 B, C)에게 복제해서 보여준다. 
하지만 이 복제된 Actor는 서버가 움직임, 동작을 정한다.(클라이언트는 조작 불가)