본문 바로가기

Study/Unreal Engine

[UE5 C++ Multiplayer Shooter] #03 Online Subsystem 과 Online Subsystem Steam

로컬 IP 주소를 이용한 네트워크 연결은 구현이 쉽지만, 한계가 명확하다. 플레이어가 서로 동일한 라우터에 연결되어 있어야 하고, 만일 외부에서 접속하고자 한다면 포트포워딩등 수많은 애로사항이 생긴다.

그렇다면, 외부에서 서버로 연결하고자 할 때 어떤 방법을 쓸 수 있을까?

 

이때 사용 가능한 것이 바로 OnlineSubsystem이다.

 

이 OnlineSubsystem은 별도의 IP를 요구하지 않는다. 네트워크 전반을 UE에서 처리하기 때문이다. 또한 하나의 코드베이스를 통해 다양한 서비스, 스팀/구글등을 지원한다.

아마존, 페이스북, 에픽 온라인 서비스, 구글, 구글플레이, iOS, 스팀 등 다양한 온라인 서브 시스템을 지원한다.

 

이러한 온라인 서브 시스템은 스팀으로 예를 들면, 다음과 같이 친구 목록을 열고, 게임에 참여하는 등 스팀에서 제공하는 온라인 API를 사용할 수 있다.

 

물론 이를 이용하기 위해서는 SteamDevAppId라는게 필요하다. 이는 게임이 정식으로 출시되었을 때, 반드시 필요하지만, 스팀에서는 개발자를 위해 480번 ID를 사용하여 스팀 API를 통합하고, 스팀 서버와의 연결, 멀티플레이 기능 등을 시험할 수 있다. 하지만 실제 출시할 게임에서는 고유의 Steam App ID를 발급받아야 한다.

 

그럼 우선, 온라인 서브 시스템을 설치하고 설정을 변경한 뒤, 세션을 생성하고 스팀을 통해 이에 접속하는 방법까지 알아보자.

 

지난시간 공부했던 것 처럼, 언리얼 엔진은 모듈 단위로 작동하고, 이를 독립된 기능으로 분리한 것이 플러그인이다. 온라인 서브시스템은 플러그인이다. 플러그인은 언리얼 빌드 툴에서 자동으로 컴파일 되는데, 만일 사용자가 싱글플레이 게임을 만들거나 플러그인에서 제공하는 기능을 사용하지 않을 경우, 이러한 컴파일 데이터는 오버헤드만 증가시킬 뿐이다. 

 

언리얼 엔진에서 제공하는 기본 플러그인, 가령 온라인 서브시스템과 같은 플러그인은 기본적으로 언리얼 엔진 설치 시 포함된 기능이다. 이를 플러그인 창에서 활성화하면, 엔진이 그 플러그인의 기능을 컴파일하고 빌드 프로세스에 포함되도록 하는 설정이다. 기본적으로 이러한 플러그인의 데이터는 개별 프로젝트에 따로 저장되지 않으며, 엔진 내부에서 공통적으로 관리된다. 플러그인의 코드 자체는 엔진에서 제공되므로, 프로젝트를 옮기거나 컴파일할 때, 엔진 내의 플러그인을 다시 다운받거나 불러올 필요가 없기 때문에 오버헤드가 줄어든다.

 

다만 직접 제작한 플러그인은 조금 다르다. 당연하게도 기본 플러그인과는 다르게 프로젝트의 Plugins 폴더에 저장된다.

 

UE -> Edit -> Plugins

Plugins 창에서는 OnlineSubsystem과, OnlineSubsystem Steam를 활성화 하였다.

 

플러그인을 활성화 하였다고 해서, 바로 Steam API를 이용할 수 있는 것은 아니다.

1. 프로젝트 모듈의 빌드 시스템에 플러그인 목록 넣기

2. DefaultEngine.ini 파일에 기본적인 스팀 API 사용 설정 넣기를 만족해야 정상적으로 사용이 가능하다.

 

Build.cs 파일은 모든 모듈이 가지고 있는 각자만의 전처리기로, 컴파일 타임에 로드되고 처리된다.

기본적인 Build.cs는 다음의 구조를 가지고 있다.

 

PCHUsage는 Precompiled Header 사용 모드를 설정하는 것으로, UseExplicitOrSharedPCHs는 명시적으로 정의된 혹은 공유된 PCH를 사용하겠다는 의미다. 이는 컴파일 시간을 줄이기 위해 사용된다.

 

눈여겨 볼 두 가지 사항은 바로 PublicDependencyModuleNames와 PrivateDependencyModuleNames이다.

  PublicDependencyModuleNames PrivateDependencyModuleNames
Access Scope Accessed by the module and its dependent modules Accessed only by the module
Dependency Inheritance Dependencies are inherited
by modules that depend on this module
Dependencies are not inherited
by dependent modules
Typical Use Case Used for modules whose APIs need to be
exposed to others
Used for modules that are used internally only

 

PublicDependencyModuleNames는 모듈이 공개적으로 의존하는 다른 모듈들의 리스트로, 만일 해당 리스트에 존재한다면 상호간의 모든 기능에 접근이 가능하다. 예를들어, Core는 OnlineSubsystem, OnlineSubststemSteam 등과 모두 상호작용이 가능하고 서로의 기능 사용이 가능하다.

PrivateDependencyModuleNames는 이 모듈 안에서는 다른 다른 public 모듈에 접근이 가능하지만, public 모듈들은 이 모듈에 접근이 불가능하다.

따라서, 광범위하게 사용되는 기능들은 Public에, 특정한 내부 구현만을 위한 경우에는 Private에 넣어 사용한다.

 

온라인 서브 시스템은 내부 구현만을 위한 것이 아니므로, Public에 추가한다. 물론, Steam도 마찬가지로 넣어주어야 사용이 가능하다.

 

마지막으로 프로젝트 파일 -> 프로젝트 이름 -> Config에 들어가면 DefaultEngine.ini가 존재한다.

 

이곳에는 다음과 같이 추가하는데, 이 내용은 UE5 Document에 존재한다. (읽어보는 것을 추천한다)

여기에 앞서 언급한 SteamDevAppId가 있는데, 만일 게임이 정식 출시된다면 꼭 개발자 아이디를 받아서 넣어주어야 한다. (안그러면 법적 문제가 생긴다.)

 

 

 

이 과정만 진행해도, 패키징 후 게임을 실행하면(스팀이 설치되어 있고 로그인 되어 있다면) 다음과 같이 사용이 가능하다.

와!