Unreal

[Unreal C++] 리슨 서버 연결하기

푸쿠이 2021. 5. 31. 23:32
리슨 서버

이전에 리슨 서버에 대해 간단하게 정리한 게 있었다.

2021.05.17 - [게임 엔진/[Unreal] Engine] - [Unreal] 멀티 플레이 정리 (데디케이트 서버, 리슨 서버)

 

[Unreal] 멀티 플레이 정리 (데디케이트 서버, 리슨 서버)

데디케이트 서버 개념 호스트를 담당하는 서버 + 여러 명의 클라이언트 설명 계속 24시간 하루종일 돌아가야하는 게임일 경우, 데디케이트 서버를 사용한다. 참고 언리얼에서 데디케이트 서버를

mingyu0403.tistory.com

데디케이트 서버를 하려면 언리얼 소스 코드를 내려받아야해서, 비교적 간단한 리슨 서버를 배웠다.

그래서 이 프로젝트에서는 리슨 서버를 사용할 것이다.

 

리슨 서버 구현하기

리슨 서버는 간단하다. 다 구현되어있어서 사실 구현할 것도 없다.

 

IP 127.0.0.1는 LocalHost로 자기 컴퓨터를 가리킨다.

IP 주소를 입력받아서 처리하려면, UI에서 입력받아서 파라미터로 넘기면 된다.

#include "Kismet/GameplayStatics.h"

void ATitle_PC::CreateServer()
{
	UGameplayStatics::OpenLevel(GetWorld(), FName("Main"), true, ((FString)(L"Listen")));
}

void ATitle_PC::JoinServer()
{
	UGameplayStatics::OpenLevel(GetWorld(), FName("127.0.0.1")); // Level 이름 대신 IP 주소.
}

나는 이렇게 구현한 함수를 버튼의 클릭 이벤트에 달았다.

UCLASS()
class MYRPG_API UUW_NaviMenu : public UUserWidget
{
	GENERATED_BODY()
	
public:
	virtual void NativeConstruct() override;

private:
	UPROPERTY(Meta = (BindWidget))
	class UButton* CreateServerBtn;
	UPROPERTY(Meta = (BindWidget))
	class UButton* JoinServerBtn;

	UFUNCTION()
	void CreateServerHandler();
	UFUNCTION()
	void JoinServerHandler();
};
void UUW_NaviMenu::NativeConstruct()
{
	Super::NativeConstruct();

	CreateServerBtn->OnClicked.AddDynamic(this, &UUW_NaviMenu::CreateServerHandler);
	JoinServerBtn->OnClicked.AddDynamic(this, &UUW_NaviMenu::JoinServerHandler);
}

void UUW_NaviMenu::CreateServerHandler()
{
	ATitle_PC* MyPC = Cast<ATitle_PC>(GetOwningPlayer());
	if (MyPC)
	{
		MyPC->CreateServer();
	}
}

void UUW_NaviMenu::JoinServerHandler()
{
	ATitle_PC* MyPC = Cast<ATitle_PC>(GetOwningPlayer());
	if (MyPC)
	{
		MyPC->JoinServer();
	} 
}

Character 클래스는 기본적으로 서버와 클라이언트 간의 동기화가 활성화되어있다.

Main으로 이동했으면 Main을 담당하는 PlayerController에서 기본 값들을 설정해준다.

#include "Main_PC.h"

void AMain_PC::BeginPlay()
{
	SetShowMouseCursor(false);
	SetInputMode(FInputModeGameOnly());
}

 

여러 개의 창으로 테스트하는 방법은 Title 레벨에서 이렇게 설정하면 된다.

Title 레벨에서는 아직 서버에 연동되어있지 않기에, Play Standalone으로 설정해야한다.

 

구현 결과