언리얼 엔진 5

언리얼엔진5 C++로 정복하기(10) 온라인 스팀 서비스 플러그인 정리

Voitcon 2024. 11. 12. 14:59

 

1. UMultiplayerSessionsSubsystem 클래스의 코드 설명

 

 

코드 설명:

  • UMultiplayerSessionsSubsystem::UMultiplayerSessionsSubsystem(): 클래스 생성자. 델리게이트를 초기화하여 특정 이벤트가 발생했을 때 호출할 함수를 등록합니다.
  • CreateUObject(this, &ThisClass::OnCreateSessionComplete): 델리게이트에 this 객체의 OnCreateSessionComplete 메서드를 바인딩하여 세션 생성 완료 시 호출하도록 설정합니다.
  • IOnlineSubsystem* Subsystem = IOnlineSubsystem::Get();: 현재 프로젝트의 온라인 서브시스템(예: 스팀)을 가져옵니다.
  • SessionInterface = Subsystem->GetSessionInterface();: 세션 관련 기능을 사용할 수 있는 인터페이스를 가져옵니다.

2. CreateSession 메서드

코드 설명:

  • if (!SessionInterface.IsValid()): 세션 인터페이스가 유효하지 않으면 세션을 생성할 수 없으므로 함수 종료.
  • auto ExistingSession = SessionInterface->GetNamedSession(NAME_GameSession);: 이미 존재하는 세션이 있는지 확인.
  • SessionInterface->DestroySession(NAME_GameSession);: 기존 세션이 있으면 제거.
  • LastSessionSettings = MakeShareable(new FOnlineSessionSettings());: 새로운 세션 설정 객체를 생성.
  • LastSessionSettings->bIsLANMatch = ...: 세션이 LAN 경기인지 여부를 설정.
  • LastSessionSettings->Set(FName("MatchType"), MatchType, ...);: 세션 설정에 커스텀 매치 유형을 추가.
  • if (!SessionInterface->CreateSession(...)): 세션 생성 시도. 실패 시 델리게이트 제거 및 실패 이벤트 브로드캐스트.

3. FindSessions 메서드

코드 설명:

  • FindSessionsCompleteDelegateHandle = ...: 세션 검색 완료 시 호출될 델리게이트를 등록.
  • LastSessionSearch = MakeShareable(new FOnlineSessionSearch());: 세션 검색 객체 생성.
  • LastSessionSearch->QuerySettings.Set(...): 세션 검색 조건을 설정하여 SEARCH_PRESENCE 필터링.
  • if (!SessionInterface->FindSessions(...)): 세션 검색 시도. 실패 시 델리게이트 제거 및 실패 브로드캐스트.

4. JoinSession 메서드

 

코드 설명:

  • JoinSessionCompleteDelegateHandle = ...: 세션 참가 완료 시 호출될 델리게이트 등록.
  • if (!SessionInterface->JoinSession(...)): 세션 참가 시도. 실패 시 델리게이트 제거 및 실패 브로드캐스트.

5. 세션 종료 및 재생성 (DestroySession 메서드)

기존의 세션을 삭제하고, 필요에 따라 새로운 세션을 생성하는 로직이 포함되어 있습니다

.if (!SessionInterface->DestroySession(NAME_GameSession)) {
    MultiplayerOnDestroySessionComplete.Broadcast(false);
}

재생성 플래그: bCreateSessionOnDestroy 플래그가 true일 경우, 세션 삭제 후 자동으로 CreateSession이 호출됩니다.

 

6. UI와의 연동 (UMenu 클래스)

UI 버튼과 연동하여 사용자가 세션 생성 및 참가를 손쉽게 할 수 있도록 합니다.

if (HostButton) {
    HostButton->OnClicked.AddDynamic(this, &ThisClass::HostButtonClicked);
}
if (JoinButton) {
    JoinButton->OnClicked.AddDynamic(this, &ThisClass::JoinButtonClicked);
}

입력 모드 설정: UI 사용 시 플레이어 컨트롤러의 입력 모드를 UI 전용 모드로 설정합니다.

FInputModeUIOnly InputModeData;
PlayerController->SetInputMode(InputModeData);
PlayerController->SetShowMouseCursor(true);