[UE5] Online Subsystem, Session Interface

kkado·2024년 6월 9일
0

UE5

목록 보기
41/61
post-thumbnail

Online Subsystem

로컬 네트워크에서 IP 주소를 통해 LAN 환경을 쉽게 구현할 수 있다. 우리의 목표는 한 사람이 '다른 사람의 IP 주소 없이' 로그인하도록 하는 것이다.

언리얼 엔진은 게임 세션을 관리하고, 다른 유저들을 연결할 수 있다. 어떤 서비스 플랫폼을 사용하냐에 따라 고유한 코드가 있을 것이다. 예를 들어 스팀은 스팀 자체적인 친구 추가 및 매치메이킹 로직이 있을 것이고, XBOX는 그것 나름의 코드 베이스가 있다. 이 모든 것을 알 필요 없이

이 기능들을 추상화한 언리얼 엔진의 online subsystem 을 사용함으로써 플랫폼 세부 사항을 처리하게끔 할 수 있다. 플랫폼에 특화된 코드는 추상화되어 있기 때문에, 우리는 언리얼 엔진만 사용하면 된다.

온라인 서브시스템은 Engine.ini에 명시된 DefaultPlatformService 를 지정할 수 있고, IOnlineSubsystem::Get() 정적 함수를 통해 IOnlineSubsystem 포인터를 얻어 사용한다.


Session Interface

'세션' 은 '서버에서 실행되고 있는 게임의 인스턴스' 이다.

세션 인터페이스는 게임 세션을 만들고, 관리하고, 파괴하는 역할과 함께, 다른 세션을 찾을 수 있는 매치메이킹 기능을 다룬다.

세션의 생명 주기는 보통 다음과 같다.

  • 세션을 만듦
  • 그 세션에 여러 플레이어들이 참여하고, 그 플레이어들을 등록
  • 세션을 시작 (게임 시작)
  • 세션이 종료되면 플레이어들을 등록 해제
  • 세션 파괴

다음 글에서부터 세션 생성, 찾기, 참여, 시작, 파괴 기능을 관심있게 다뤄보고자 한다.


스팀 환경 설정

먼저 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 파일 맨 아래에 이 내용을 추가.


OnlineSubsystem, SessionInterface 만들기

먼저 .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())
		);
	}
profile
울면안돼 쫄면안돼 냉면됩니다

0개의 댓글