본문 바로가기
Unreal/Manual

Unreal C++ 리슨 서버 오픈 레벨 Play as Listen Server Open Level

by Dev_카페인 2023. 12. 13.
반응형

[Unreal/C++] 리슨 서버 오픈 레벨 Play as Listen Server Open Level

 

언리얼 엔진 에서 리슨 서버를 열기 위해 OpenLevel을 사용할 수 있습니다.

 

OpenLevel은 UGameplayStatics 클래스가 가지고 있으며 #include "Kismet/GameplayStatics.h" 헤더를 추가해 사용할 수 있습니다.

OpenLevel의 구문은 월드, 레벨 이름, 절대이동, 옵션을 사용합니다.

static void OpenLevel
(
    const UObject * WorldContextObject,
    FName LevelName,
    bool bAbsolute,
    FString Options
)

레벨 이름의 경우 검색 속도를 위해 전체 경로를 포함해주는 것이 좋지만 레벨 이름만 적어도 상관 없습니다.

bool 형 변수 bAbsolute의 경우 절대 이동과 상대 이동의 차이가 있다고 합니다. 상대 이동은 이전 이동 매개변수(예: 팀, 캐릭터 등)를 유지하면서 맵을 변경하는 것이었고, 절대는 모든 것을 "재설정"하여 맵을 변경하는 데 사용되었습니다.

 

What's the different between absolute travel and relative travel?

Hi! What the different between absolute travel and relative travel? GWorld->ServerTravel(URL, true); vs GWorld->ServerTravel(URL, false);

forums.unrealengine.com

옵션의 경우 명령줄 인수를 통해 여러 옵션을 설정할 수 있다고 하는데 현재 지식으로는 아직 정확한 사용법을 모릅니다.

 

Command-Line Arguments

Arguments that you can pass to an engine executable to customize how the engine runs on startup.

docs.unrealengine.com

다만 Listen서버를 열기 위해 필요한 옵션은 Listen입니다.

Unreal Engine의 코드를 살펴보면 옵션 중 Listen이나 LAN 등의 옵션이 지정되어 있으며 URL의 참조를 위해 필요한 것 같습니다.

 

 

위젯에서 Listen 서버를 열고 해당 서버에 참여하는 코드는 다음과 같습니다.

UGameplayStatics::OpenLevel(GetWorld(), FName("LevelName"), true, ((FString)(L"Listen")));

전체 적인 서버 생성 코드에서 중요하게 확인해야 하는 것은 없습니다.

버튼을 클릭하면 단순히 OpenLevel 함수를 호출하는 것 입니다.

#include "Lobby/Widgets/W_HostServer.h"

#include "Kismet/GameplayStatics.h"
#include "Components/Button.h"

void UW_HostServer::NativeConstruct()
{
	Super::NativeConstruct();

	Btn_Create->OnClicked.AddDynamic(this, &UW_HostServer::Btn_Create_OnClick);
}

void UW_HostServer::Btn_Create_OnClick()
{
	UGameplayStatics::OpenLevel(GetWorld(), FName("TestLevel"), true, ((FString)(L"Listen")));
}

 

마찬가지로 열린 서버에 참여하는 것은 레벨의 이름 대신 주소를 적습니다.

UGameplayStatics::OpenLevel(GetWorld(), FName( IP Address ));

해당 코드에서는 자기 자신을 가리키는 127.0.0.1(IP 프로토콜의 약속) 을 사용합니다.

자신의 IP주소를 직접 적어도 무방합니다.

#include "Lobby/Widgets/W_JoinServer.h"

#include "Kismet/GameplayStatics.h"
#include "Components/Button.h"

void UW_JoinServer::NativeConstruct()
{
	Super::NativeConstruct();

	Btn_Connect->OnClicked.AddDynamic(this, &UW_JoinServer::Btn_Connect_OnClick);
}

void UW_JoinServer::Btn_Connect_OnClick()
{
	UGameplayStatics::OpenLevel(GetWorld(), FName("127.0.0.1"));
}

 

이렇게 직접 생성하고 연결할 경우 언리얼 에디터에서 넷 모드를 Play Standalone으로 변경해주어야 합니다.

아무런 셋팅 없이 Play As Listen Server로 시작할 경우 OpenLevel을 실행시키는 순간 모든 클라이언트가 각각의 서버를 만들게 되는 것 같았습니다. 이 부분에 대해 알고 계신 분은 공유 부탁드립니다.

 

완성된 화면입니다.

 

반응형