본문 바로가기
[ Unreal5 ]/- 언리얼엔진5 멀티

언리얼엔진5 Create Session

by MRG 2025. 2. 14.
728x90
반응형

 

 

▣ bInitServerOnClient=true란?
bInitServerOnClient=true는 Steam Online Subsystem에서 클라이언트가 직접 서버를 호스팅 할 수 있도록 설정하는 옵션입니다.
즉, 전용 서버(Dedicated Server) 없이 클라이언트가 자체적으로 멀티플레이어 세션을 만들고, 다른 플레이어를 초대할 수 있도록 합니다.

▣ 언제 bInitServerOnClient=true를 사용해야 할까?
호스트 플레이어(클라이언트)가 직접 세션을 만들고 다른 플레이어를 초대하는 경우
일반적인 P2P 멀티플레이 게임에서는 플레이어 한 명이 세션을 생성하고 다른 플레이어가 참가하는 방식이 일반적입니다.
예를 들어, 로컬에서 방을 만들고 친구를 초대하는 Steam 멀티플레이 게임이라면 bInitServerOnClient=true를 설정해야 합니다.


▣ Dedicated Server(전용 서버)를 사용하지 않을 경우
전용 서버를 사용하면 모든 플레이어가 특정 서버에 접속해야 하지만, bInitServerOnClient=true를 설정하면 클라이언트가 직접 세션을 호스팅 할 수 있습니다.
별도의 전용 서버 없이, 플레이어가 방을 만들고 친구들이 접속하는 구조가 가능합니다.


▣ Steam P2P 기능을 사용하려는 경우
Steam의 Lobby 기능을 활용하여 멀티플레이를 구현하는 경우 필요할 수 있습니다.
Steam의 네트워크 기능을 활용하려면 클라이언트가 직접 세션을 만들 수 있어야 합니다.

 

 

▣ DefaultEngine.ini 적용 방법
프로젝트를 완전히 종료하세요.
Unreal Editor와 관련된 모든 인스턴스를 종료합니다.
Binary, Saved, Intermediate 폴더 삭제 (캐시 클리어)
삭제하는 이유: Unreal Engine은 설정을 캐싱하기 때문에, 기존 캐시를 삭제해야 변경된 설정이 적용됩니다.
Unreal Editor 다시 실행
UE5를 다시 열고 프로젝트를 실행하세요.

 

 

 

▣ #include "OnlineSubsystem.h"
이 헤더 파일은 온라인 서브시스템(OnlineSubsystem)을 관리하는 역할을 합니다.
즉, Steam, Epic Online Services(EOS), PlayStation Network(PSN), Xbox Live 같은 온라인 멀티플레이 시스템과 연결하는 기능을 제공합니다.

▣  주요 역할
IOnlineSubsystem::Get()을 사용하여 특정 플랫폼의 온라인 기능을 가져올 수 있음
온라인 관련 플러그인 (OnlineSubsystemSteam, OnlineSubsystemEOS 등)을 관리함

 

▣ Session 개념
Session(세션)이란 멀티플레이 게임에서 플레이어들이 함께 게임을 할 수 있도록 관리하는 하나의 그룹입니다.
즉, 게임 서버를 생성하고, 플레이어들이 해당 서버에 참가할 수 있도록 하는 기능입니다.


▣ Session의 핵심 역할
게임 방 생성 및 관리
호스트(방장)가 세션을 생성하면, 세션 정보가 온라인 서브시스템(예: Steam, EOS, LAN 등)에 저장됩니다.
다른 플레이어들은 이 정보를 조회하고 세션에 참가할 수 있습니다.


플레이어 매칭 및 연결
온라인 기능이 있는 게임에서는 세션을 통해 플레이어를 매칭하고, 동일한 게임에 연결합니다.
예를 들어, Call of Duty, Fortnite 같은 게임에서 매칭 시스템이 바로 이 세션을 기반으로 작동합니다.


세션 설정 관리
최대 인원수, 공개/비공개 여부, P2P 또는 전용 서버 여부 등의 설정을 포함할 수 있습니다.


▣ 멀티플레이 관련 델리게이트 활용
세션 생성(CreateSession)
세션 찾기(FindSession)
세션 참가(JoinSession)
세션 종료(DestroySession) 등의 기능을 Unreal Engine에서 사용할 수 있습니다.


▣ Session 생성 과정
세션을 생성하면 어떻게 진행될까?
CreateSession()을 호출하여 세션을 생성 요청
온라인 서브시스템(예: Steam, EOS)에서 세션을 처리
세션이 생성되면 OnCreateSessionComplete() 델리게이트를 통해 성공 여부를 반환


▣ Session을 이용한 멀티플레이 흐름
호스트(Host)가 CreateSession()을 호출하여 세션을 생성
세션이 생성되면 Steam/EOS 서버에 등록
클라이언트(Joiner)가 FindSessions()를 호출하여 세션 검색
참가할 세션이 있다면 JoinSession()을 호출하여 참가
플레이어들이 세션을 통해 같은 맵에서 게임을 시작
게임이 끝나거나 방을 닫으면 DestroySession()을 호출하여 세션 삭제


▣ CreateSession() 호출 (Session Interface)
CreateSession()을 호출하면 Steam 또는 온라인 서브시스템을 통해 세션이 생성됩니다.
세션 생성이 성공하거나 실패하면 콜백 이벤트(Session Created)가 트리거 됩니다.


Delegate List에 추가
FOnCreateSessionCompleteDelegate라는 델리게이트가 세션 생성 완료 이벤트에 바인딩됩니다.
즉, CreateSession()이 실행되면 이 델리게이트가 결과를 받을 준비를 합니다.
OnCreateSessionComplete() 실행

세션이 성공적으로 생성되면 OnCreateSessionComplete() 함수가 실행됩니다.
델리게이트를 통해 이 함수를 자동 호출하는 방식입니다.

 

 

▣ 코드 설명
1. IOnlineSessionPtr OnlineSessionInterface;
온라인 세션을 관리하는 인터페이스 포인터입니다.
Unreal Engine의 온라인 서브시스템(IOnlineSubsystem)에서 가져와 사용합니다.
Steam과 같은 외부 온라인 서비스와의 연결을 관리하는 데 사용됩니다.
주로 OnlineSessionInterface->CreateSession(), OnlineSessionInterface->DestroySession() 등의 함수로 세션을 조작할 수 있습니다.


2. void CreateGameSession();
게임 세션을 생성하는 함수입니다.
블루프린트에서 직접 호출할 수 있도록 UFUNCTION(BlueprintCallable)을 추가하였습니다.
기존 세션이 존재하면 먼저 삭제하고, 이후 새로운 세션을 생성합니다.
세션 설정을 조정하여 LAN, 공개/비공개, 플레이어 수 등을 결정할 수 있습니다.


3. void OnCreateSessionComplete(FName SessionName, bool IsWasSucceessful);
세션 생성이 완료되었을 때 호출되는 콜백 함수입니다.
CreateSession() 함수 실행 후, 성공 여부에 따라 실행됩니다.
SessionName은 생성된 세션의 이름을 나타내며, 성공 여부는 IsWasSuccessful로 전달됩니다.
성공하면 플레이어를 세션에 추가하거나, UI를 업데이트하는 등의 후속 처리를 진행할 수 있습니다.


4. FOnCreateSessionCompleteDelegate CreateSessionCompleteDelegate;
세션 생성 완료 이벤트를 처리하는 델리게이트입니다.
OnlineSessionInterface->AddOnCreateSessionCompleteDelegate_Handle(CreateSessionCompleteDelegate); 형태로 등록하여, 세션 생성이 완료될 때 OnCreateSessionComplete 함수가 호출되도록 설정합니다.

 

 

▣ 주요 기능
세션의 LAN 여부, 최대 플레이어 수, 공개 여부, Steam 사용 여부 등을 설정할 수 있습니다.
FOnlineSessionSettings 클래스를 사용하여 세션의 속성을 정의합니다.

 

 

 

▣ : CreateSessionCompleteDelegate()
위 코드에서 : 뒤에 있는 CreateSessionCompleteDelegate(...) 부분은 멤버 변수의 초기화 리스트(Initializer List)를 사용한 것입니다.

 

&ThisClass::의 의미와 사용법
&ThisClass::는 현재 클래스의 특정 멤버 함수를 가리키는 방식으로, 델리게이트(delegate) 또는 함수 포인터를 사용할 때 주로 사용됩니다.
Unreal Engine에서는 델리게이트를 사용하여 이벤트 기반 시스템을 구현할 때, 클래스의 멤버 함수를 바인딩하는 용도로 활용됩니다.

기본 개념
C++에서 클래스의 멤버 함수 포인터를 가리킬 때는 &클래스이름::함수명 형태를 사용합니다.


▣ 초기화 리스트란?
C++에서는 멤버 변수는 생성자가 실행되기 전에 초기화되어야 합니다.
초기화 리스트(Initializer List)는 클래스의 멤버 변수를 생성자 내부의 코드 실행 전에 초기화하는 방법입니다.
: 변수명(값) 형식으로 사용되며, 생성자 호출과 동시에 멤버 변수의 값을 설정할 수 있습니다.
이 변수는 생성과 동시에 특정 함수(OnCreateSessionComplete())를 바인딩해야 합니다.
만약 초기화 리스트를 사용하지 않고 생성자 내부에서 바인딩하면, 기본 생성자가 먼저 실행된 후 다시 값을 할당하는 방식이 됩니다.

AThirdPersonTestCharacter::AThirdPersonTestCharacter()
{
    CreateSessionCompleteDelegate = FOnCreateSessionCompleteDelegate::CreateUObject(
        this, &AThirdPersonTestCharacter::OnCreateSessionComplete);
}

생성자 내부에서 값을 할당하면, 기본 생성자를 한 번 호출한 후 다시 바인딩하는 불필요한 과정이 생깁니다.
따라서 초기화 리스트를 사용하여 불필요한 생성자 호출 없이 바로 값을 할당하는 것이 더 효율적입니다.

 

 

 

▣ 코드 상세 설명
▣ OnlineSessionInterface.IsValid() 

IsValid()는 Unreal Engine에서 포인터 또는 스마트 포인터(TSharedPtr, TWeakPtr 등)가 유효한지(Null이 아닌지) 확인하는 함수입니다.


▣ OnlineSessionInterface가 유효하지 않으면 세션을 생성할 수 없으므로 함수를 종료합니다.
보통 BeginPlay()에서 OnlineSubsystem::Get()->GetSessionInterface()를 통해 초기화해야 합니다.
기존 세션 삭제

▣ GetNamedSession(NAME_GameSession)을 사용하여 기존 세션이 존재하는지 확인합니다.
세션이 존재하면 DestroySession(NAME_GameSession)을 호출하여 삭제합니다.
기존 세션이 남아 있으면 새로운 세션을 생성할 수 없으므로 반드시 제거해야 합니다.
세션 생성 완료 이벤트 핸들러 추가

 

▣ OnlineSessionInterface->AddOnCreateSessionCompleteDelegate_Handle()란?
이 함수는 세션 생성이 완료되었을 때 실행될 델리게이트(이벤트 핸들러)를 등록하는 역할을 합니다.
즉, CreateSession()을 호출한 후, 세션 생성이 성공했는지 또는 실패했는지 확인하기 위해 특정 함수를 실행하도록 설정하는 기능을 합니다.
CreateSessionCompleteDelegate는 세션 생성이 완료되었을 때 실행될 함수를 저장한 델리게이트입니다.
AddOnCreateSessionCompleteDelegate_Handle()는 세션 생성이 끝났을 때 이 델리게이트를 실행하도록 등록합니다.OnCreateSessionComplete가 세션 생성 완료 후 호출될 수 있도록 델리게이트를 등록합니다.\

 

▣ TSharedPtr<FOnlineSessionSettings> SessionSettings = MakeShareable(new FOnlineSessionSettings()); 설명
이 코드는 FOnlineSessionSettings 객체를 스마트 포인터(TSharedPtr)로 감싸서 안전하게 관리하는 코드입니다.
즉, 새로운 세션 설정 객체를 생성한 후, 이를 TSharedPtr를 사용하여 자동으로 메모리를 관리하도록 합니다.

 

▣ TSharedPtr이란?
TSharedPtr은 Unreal Engine에서 제공하는 스마트 포인터(Smart Pointer)로, 참조 카운팅(Reference Counting)을 통해 메모리를 자동 관리하는 포인터입니다.

1. TSharedPtr의 특징
동적 할당된 객체를 자동으로 관리 → new로 생성된 객체를 명시적으로 delete하지 않아도 됨
 참조 카운트를 기반으로 자동 해제 → 참조하는 개체가 더 이상 없으면 자동으로 메모리 해제됨
여러 개의 TSharedPtr가 같은 객체를 공유할 수 있음
C++의 std::shared_ptr와 유사

2. MakeShareable(new FOnlineSessionSettings())의 역할
 MakeShareable()란?
MakeShareable()은 일반 포인터를 TSharedPtr로 변환하는 함수입니다.

new FOnlineSessionSettings()
FOnlineSessionSettings는 Unreal Engine의 온라인 세션 설정을 저장하는 구조체입니다.
이 구조체에는 최대 플레이어 수, LAN 여부, 공개/비공개 여부 등의 세션 설정 값이 포함됩니다.
new FOnlineSessionSettings()를 사용하면 동적으로 FOnlineSessionSettings 객체가 생성됩니다.


▣ 세션 설정 구성 (FOnlineSessionSettings)
bIsLANMatch = false : LAN이 아닌 온라인 멀티플레이 세션을 생성합니다.
NumPublicConnections = 4 : 최대 4명의 플레이어가 참여할 수 있도록 설정합니다.
bAllowJoinInProgress = true : 게임이 진행 중이어도 플레이어가 참가할 수 있도록 허용합니다.
bAllowJoinViaPresence = true : 친구 목록을 통해 세션에 참가할 수 있도록 허용합니다.
bShouldAdvertise = true : 세션을 검색할 수 있도록 공개합니다.
bUsesPresence = true : Steam 등의 온라인 플랫폼에서 플레이어의 존재 상태를 관리하도록 설정합니다.
bUseLobbiesIfAvailable = true : Steam 로비 시스템이 지원된다면 로비 기능을 활용하도록 설정합니다.
세션 생성 요청

▣ GetFirstLocalPlayerFromController()를 사용하여 현재 플레이어의 Net ID를 가져옵니다.

 

CreateSession()을 호출하여 세션을 생성합니다.

 

 

▣ 코드 상세 설명
세션 생성 완료 이벤트가 발생하면 메시지를 출력

이 함수는 CreateSession()을 호출한 후, 세션 생성이 완료되면 자동으로 실행됩니다.
OnCreateSessionComplete가 실행되었음을 알리기 위해 디버그 메시지를 출력합니다.
세션 생성이 성공했는지 여부 확인

IsWasSuccessful이 true이면 세션 생성 성공, false이면 세션 생성 실패를 의미합니다.
세션 생성 성공 시

SessionName.ToString()을 이용해 생성된 세션의 이름을 출력합니다.
GEngine->AddOnScreenDebugMessage를 통해 화면에 성공 메시지를 표시합니다.
세션 생성 실패 시

"Failed to Create Session"이라는 메시지를 출력합니다.
이후, 추가적인 오류 처리를 수행할 수도 있습니다. (예: 로그 출력, 다시 시도 로직 추가 등)

 

 

▣ API

https://dev.epicgames.com/documentation/en-us/unreal-engine/API/Plugins/OnlineSubsystem/FOnlineSessionSettings

 

 

 

728x90
반응형

댓글