로컬 네트워크에서 IP 주소를 통해 LAN 환경을 쉽게 구현할 수 있다. 우리의 목표는 한 사람이 '다른 사람의 IP 주소 없이' 로그인하도록 하는 것이다.
언리얼 엔진은 게임 세션을 관리하고, 다른 유저들을 연결할 수 있다. 어떤 서비스 플랫폼을 사용하냐에 따라 고유한 코드가 있을 것이다. 예를 들어 스팀은 스팀 자체적인 친구 추가 및 매치메이킹 로직이 있을 것이고, XBOX는 그것 나름의 코드 베이스가 있다. 이 모든 것을 알 필요 없이
이 기능들을 추상화한 언리얼 엔진의 online subsystem
을 사용함으로써 플랫폼 세부 사항을 처리하게끔 할 수 있다. 플랫폼에 특화된 코드는 추상화되어 있기 때문에, 우리는 언리얼 엔진만 사용하면 된다.
온라인 서브시스템은 Engine.ini
에 명시된 DefaultPlatformService
를 지정할 수 있고, IOnlineSubsystem::Get()
정적 함수를 통해 IOnlineSubsystem
포인터를 얻어 사용한다.
'세션' 은 '서버에서 실행되고 있는 게임의 인스턴스' 이다.
세션 인터페이스는 게임 세션을 만들고, 관리하고, 파괴하는 역할과 함께, 다른 세션을 찾을 수 있는 매치메이킹 기능을 다룬다.
세션의 생명 주기는 보통 다음과 같다.
다음 글에서부터 세션 생성, 찾기, 참여, 시작, 파괴 기능을 관심있게 다뤄보고자 한다.
먼저 Files -> Plugins에 들어가서 Online Subsystem Steam
을 검색하고 추가해 준다. (재시작 필요)
그리고 Build.cs
파일을 열어 모듈 설정을 수정한다.
끝에 "OnlineSubsystemSteam", "OnlineSubsystem"
을 추가.
다음으로는 DefaultEngine.ini
파일을 수정한다.
https://docs.unrealengine.com/4.27/en-US/ProgrammingAndScripting/Online/Steam/
중요한 것은
; If using Sessions
; bInitServerOnClient=true
이 부분을 삭제하고 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"
DefaultEngine.ini
파일 맨 아래에 이 내용을 추가.
먼저 .h 파일에 IOnlineSessionPtr
을 만든다.
#include "Interfaces/OnlineSessionInterface.h"
public:
// Pointer to the online session interface
IOnlineSessionPtr OnlineSessionInterface;
그리고 생성자의 내부에 IOnlineSubsystem* OnlineSubsystem
을 만들고, IOnlineSubsystem::Get()
함수를 통해 현재 사용하고 있는 온라인 서브시스템을 얻을 수 있다.
이후 GetSessionInterface()
함수를 통해 세션인터페이스를 지정한다.
#include "OnlineSubsystem.h"
/*
생성자 내부
*/
IOnlineSubsystem* OnlineSubsystem = IOnlineSubsystem::Get();
if (OnlineSubsystem)
{
OnlineSessionInterface = OnlineSubsystem->GetSessionInterface();
GEngine->AddOnScreenDebugMessage(
-1,
15,
FColor::Red,
FString::Printf(TEXT("Found session %s"), *OnlineSubsystem->GetSubsystemName().ToString())
);
}