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

언리얼엔진5 Session Join Setup

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

 

▣ 코드 상세 설명
UFUNCTION(BlueprintCallable) void JoinGameSession();
UFUNCTION(BlueprintCallable)을 추가하여 블루프린트에서도 호출 가능하도록 설정
현재 온라인에서 사용 가능한 게임 세션을 검색하고, 참가하는 역할을 하는 함수

void OnFindSessionsComplete(bool IsWasSuccessful);
세션 검색이 완료되었을 때 호출되는 콜백 함수
 IsWasSuccessful이 true이면 세션 검색 성공, false이면 검색 실패
JoinGameSession()을 실행하면, 온라인에서 참여 가능한 세션을 검색하고, 그 결과를 OnFindSessionsComplete()에서 처리

FOnFindSessionsCompleteDelegate FindSessionsCompleteDelegate;
FindSessionsCompleteDelegate는 세션 검색이 완료되었을 때 실행할 함수를 저장하는 델리게이트
OnlineSessionInterface->FindSessions()를 호출한 후, 검색이 완료되면 자동으로 OnFindSessionsComplete() 함수가 실행되도록 설정

TSharedPtr<FOnlineSessionSearch> SessionSearch;
SessionSearch는 현재 사용 가능한 세션 목록을 저장하는 객체
세션 검색 요청을 보낸 후, 검색된 세션 목록을 SessionSearch->SearchResults에 저장
TSharedPtr을 사용하여 자동 메모리 관리를 수행

 

 

▣ 세션을 생성하고 검색하는 기능을 담당하는 델리게이트를 생성자에서 초기화
CreateGameSession()을 호출하면 세션이 생성되고, OnCreateSessionComplete()가 실행
JoinGameSession()을 호출하면 세션을 검색하고, OnFindSessionsComplete()가 실행
델리게이트를 등록하여 비동기적으로 이벤트를 처리할 수 있도록 설정

 

 

▣ if (!OnlineSessionInterface.IsValid())
OnlineSessionInterface가 유효한지 확인하여, nullptr이면 세션 검색을 실행하지 않음
OnlineSessionInterface는 Unreal Engine의 온라인 세션을 관리하는 인터페이스 객체이며, 반드시 초기화되어 있어야 함

▣  OnlineSessionInterface->AddOnFindSessionsCompleteDelegate_Handle(FindSessionsCompleteDelegate);
세션 검색이 완료되었을 때 실행될 델리게이트를 등록
FindSessionsCompleteDelegate는 세션 검색이 끝났을 때 자동 실행될 함수를 지정하는 역할
세션 검색이 완료되면 자동으로 OnFindSessionsComplete() 함수가 실행됨

▣  SessionSearch = MakeShareable(new FOnlineSessionSearch());
새로운 세션 검색 객체(FOnlineSessionSearch)를 생성
MakeShareable()을 사용하여 TSharedPtr로 메모리를 관리 (자동 해제됨)
SessionSearch는 현재 검색된 세션 목록을 저장하는 역할

▣ SessionSearch->MaxSearchResults = 10000;
최대 검색할 세션 개수를 10000개로 설정
기본값은 1000이며, Steam과 같은 플랫폼에서는 제한될 수도 있음
너무 큰 값으로 설정하면 검색 속도가 느려질 수 있으므로 적절한 값으로 조절해야 함

▣ SessionSearch->bIsLanQuery = false;
LAN(Local Area Network) 세션이 아닌, 온라인 세션을 검색하도록 설정
LAN 세션만 검색하려면 true로 설정하면 됨
Steam, EOS 등의 온라인 네트워크를 사용할 경우 false로 설정해야 검색이 가능

▣ SessionSearch->QuerySettings.Set(SEARCH_PRESENCE, true, EOnlineComparisonOp::Equals);
플레이어 상태(Presence)가 활성화된 세션만 검색하도록 설정
SEARCH_PRESENCE를 true로 설정하면 친구 초대 및 상태 관리가 가능한 세션만 검색
EOnlineComparisonOp::Equals를 사용하여 필터링 조건을 "같은 값만 검색"으로 설정

 

▣ QuerySettings.Set()란?
QuerySettings.Set(Key, Value, ComparisonOp)
QuerySettings.Set() 함수는 세션을 검색할 때 특정 조건을 설정하는 역할을 합니다.
첫 번째 매개변수: 검색 조건 키 (SEARCH_PRESENCE)

 

▣ SEARCH_PRESENCE를 사용하려면 #include "Online/OnlineSessionNames.h"를 선언

 

▣ SEARCH_PRESENCE란?
SEARCH_PRESENCE는 온라인 세션 검색 시, 특정 세션이 플레이어 상태(Presence)를 사용하고 있는지 확인하는 조건 키입니다.
플레이어 상태(Presence)란, Steam, Xbox Live, PlayStation Network 등에서 플레이어의 온라인 상태를 감지하는 기능입니다.
SEARCH_PRESENCE = true이면 Presence 기능이 활성화된 세션만 검색하게 됩니다.

▣  SEARCH_PRESENCE가 필요한 이유
친구 목록에서 "현재 게임 중" 상태인 세션만 검색하도록 필터링할 수 있음.
bUsesPresence = true로 설정된 세션만 검색할 수 있음.
Steam, EOS 등의 멀티플레이 플랫폼에서 Presence가 활성화된 세션만 검색 가능.

 

두 번째 매개변수: 검색할 값 (true)

세 번째 매개변수: 비교 연산자 (EOnlineComparisonOp::Equals)

 

EOnlineComparisonOp::Equals란?
EOnlineComparisonOp::Equals는 검색 조건을 "같은 값만 포함"하는 방식으로 설정하는 연산자입니다.
즉, "Presence 기능이 활성화된 세션만 검색"이라는 필터 역할을 합니다.

Equals == 정확히 일치하는 값만 검색 (ex: SEARCH_PRESENCE == true인 세션만 검색)
NotEquals != 특정 값이 아닌 세션만 검색
GreaterThanEquals >= 특정 값보다 크거나 같은 세션만 검색
LessThanEquals <= 특정 값보다 작거나 같은 세션만 검색


▣ const ULocalPlayer* LocalPlayer = GetWorld()->GetFirstLocalPlayerFromController();
현재 로컬 플레이어(자신)의 고유 네트워크 ID를 가져오기 위한 코드
FindSessions() 함수는 현재 플레이어의 네트워크 ID를 필요로 하기 때문에, 이를 먼저 가져와야 함

▣ OnlineSessionInterface->FindSessions(*LocalPlayer->GetPreferredUniqueNetId(), SessionSearch.ToSharedRef());
세션 검색 요청을 실행
첫 번째 매개변수: 현재 플레이어의 고유 네트워크 ID
두 번째 매개변수: 세션 검색 객체 (SessionSearch)
FindSessions()가 실행된 후, 검색이 완료되면 자동으로 OnFindSessionsComplete()가 호출됨

 

▣ SessionSearch.ToSharedRef()란?
SessionSearch.ToSharedRef()는 스마트 포인터(TSharedPtr)를 TSharedRef로 변환하는 함수입니다.
즉, TSharedPtr<FOnlineSessionSearch> 타입을 TSharedRef<FOnlineSessionSearch>로 변환하여 FindSessions() 함수에 전달하는 역할을 합니다.

 

 

▣ GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::Blue, TEXT("OnFindSessionsComplete"));
세션 검색이 완료되었음을 알리는 디버그 메시지를 출력
JoinGameSession()을 호출한 후, FindSessions()의 검색이 끝나면 이 함수가 실행됨

▣  for (auto Result : SessionSearch->SearchResults)
SessionSearch->SearchResults에는 검색된 모든 세션의 정보가 저장됨
for 루프를 사용하여 검색된 세션을 하나씩 순회하며 정보를 출력

▣ FString Id = Result.GetSessionIdStr();
Result.GetSessionIdStr()를 사용하여 세션의 고유 ID를 문자열로 가져옴
이 ID는 특정 세션을 식별하는 데 사용됨

▣ FString UserName = Result.Session.OwningUserName;
Result.Session.OwningUserName은 해당 세션(방)의 방장을 의미하는 유저 이름
이 값을 통해 어떤 플레이어가 해당 세션을 호스팅하고 있는지 확인 가능

▣ GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::Red, FString::Printf(TEXT("Id: %s | UserName: %s"), *Id, *UserName));
검색된 각 세션의 ID 및 방장 유저명을 화면에 출력
이를 통해 현재 참가 가능한 세션 목록을 확인 가능

 

 

 

 

 

▣ 다른 스팀계정으로 다른 컴퓨터에서 2번키를 누르면 이렇게 ID랑 유저이름이 출력됩니다. 

728x90
반응형

댓글