언리얼 엔진 온라인 서브시스템(스팀) 알아보기

Lee Raccoon·2024년 6월 22일
0

멀티플레이 구현의 목표는 다른 유저들이 IP 주소를 갖고있지 않아도 로그인하여 참가할 수 있는 게임을 만드는 것이다.

온라인 서브 시스템이 뭔데

리슨 서버를 열었다고 해도 서버의 IP를 플레이어들은 알 방법이 없기 때문에 중간에 특정 서비스를 거쳐 이를 알아낼 수 있어야한다.

이런 서비스 중 대표적인 것이 스팀, XBox Live 등이 있다.

각 서비스들은 각각 유저 간의 연결을 처리하기 위해 고유한 코드를 갖고 있다.

그렇다면 스팀에 올릴 떄는 스팀의 코드를, XBox에 올릴 때는 XBox의 코드를 따라 가야하는가?
이건 너무 불편하다.
그래서 언리얼에서는 공통적으로 사용할 수 있는 코드 베이스를 제공한다!

언리얼 엔진에서는 어떤 서비스에 연결되었느냐에 따라서 알아서 세부 사항을 처리해주며 추상 계층 (Abstraction Layer)이라고 불린다.

그리고 이렇게 추상화된 네트워킹 계층을 온라인 서브시스템이라고 부른다.

이로써 우리 개발자들은 언리얼 코드 베이스와만 친해진다면 된다!
이렇게 감사할 수가..

한 문장으로 정리하자면 온라인 플랫폼 서비스 기능에 액세스 하는 방법, 인터페이스를 제공하는 것이다.
(플랫폼은 위에서 말한 스팀, XBox Live 등이 있겠지요)

온라인 세션

다양한 인터페이스 중 온라인 세션에 대해 알아보자.

세션 인터페이스는 게임 세션을 생성, 관리, 파괴하는 것을 담당한다.
세션 검색과 매치메이킹, 세션 검색도 다룬다.
(세션은 서버에서 돌아가고 있는 게임의 인스턴스라고 생각하면 편하다.)

세션의 생명주기

보통 게임을 한다면 이런 타입의 세션 생명주기를 갖게 된다.

  • 세션 생성
  • 플레이어 등록
  • 세션 시작
  • 게임 플레이
  • 세션 종료
  • 플레이어 연결 종료
  • 세션을 업데이트하거나 세션 파괴

그리고 세션 인터페이스에는 다양한 기능이 있는데 그 중

  • CreateSession()
  • FindSession()
  • JoinSession()
  • StartSession()
  • DestroySession()

이렇게 다섯함수만으로도 이미 훌륭하게 작동하는 게임을 만들 수 있다.

그러면 게임에서 Host, Join 버튼을 나누어 게임을 만들어 볼 수 있다.

Host
호스트의 경우는 방만들기라고 생각하면 쉽다. Host를 누르면 CreateSession()을 하고 로비에서 대기한다.
Join
조인 하는 사람들은 우선 FindSession()으로 적절한 세션을 검색한다.
세션을 찾으면 JoinSession()으로 세션에 대한 IP 주소를 얻어낼 수 있다.
그렇다면 이제 ClientTravel() 함수를 사용하여 해당 세션에 접속할 수 있을 것이다.

한번 해보자

환경 구축

플러그인에 Online Subsystem Steam을 검색하면 아래와 같은 플러그인이 나오는데, 활성화 시켜준다.

그리고 .Build.cs에서 모듈 추가를 해준다.
OnlineSubsystemOnlineSubsystemSteam은 서로 다른 모듈이기 때문에 둘 중 하나만 해주는 게 아니라 꼭 둘 다 해주어야한다

PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "EnhancedInput", "OnlineSubsystemSteam", "OnlineSubsystem" });

그리고 프로젝트 Config 폴더에 있는 DefaultEngine.ini에서 뭘 좀 추가해주어야한다.

Unreal OnlineSubsystemSteam
공식 문서에서도 찾아볼 수 있다.

[/Script/Engine.GameEngine]
+NetDriverDefinitions=(DefName="GameNetDriver",DriverClassName="OnlineSubsystemSteam.SteamNetDriver",DriverClassNameFallback="OnlineSubsystemUtils.IpNetDriver")

[OnlineSubsystem]
DefaultPlatformService=Steam

[OnlineSubsystemSteam]
bEnabled=true
SteamDevAppId=480
bInitServerOnClient=true

[/Script/OnlineSubsystemSteam.SteamNetDriver]
NetConnectionClassName="OnlineSubsystemSteam.SteamNetConnection"

얘네를 추가해주고 다시 프로젝트 파일을 생성해주자

프로젝트 파일 오른쪽 클릭하면 나온다 (혹시 모르시는 분들을 위해,,)

테스트

온라인 서브시스템에 연결됐는지 확인을 해보자

#include "OnlineSubsystem.h"
#include "Interfaces/OnlineSessionInterface.h"

IOnlineSubsystem* OnlineSubsystem = IOnlineSubsystem::Get();
if (OnlineSubsystem)
{
	OnlineSubsystem->GetSessionInterface();

	if (GEngine)
	{
		GEngine->AddOnScreenDebugMessage(
			-1,
			15.f,
			FColor::Blue,
			FString::Printf(TEXT("Found Subsystem %s"), *OnlineSubsystem->GetSubsystemName().ToString())
		);
	}
}

우리는 스팀을 설정했으니 이제 스팀이 뜨겠지? 라는 설레는 마음으로 실행을 해보면?

??
NULL이 뜨는 것을 볼 수 있다.
NULL인데 잘도 오류는 안떴네.. 라는 생각을 했는데
실제로 언리얼 엔진은 NULL이라는 온라인 서브시스템을 갖고 있다(?)
LAN 환경에서를 위해 라는데 신기하다

아무튼 왜 안뜨는고 하니 패키징을 해야한다고 한다.
PIE는 지원을 안하는건가..

패키징을 하니 바로 잘 되는 모습을 볼 수 있다.

스팀 화면도 띄울 수 있으니 뭔가 기분이 좋다.

profile
영차 영차

0개의 댓글

관련 채용 정보