Game Instance Header File
#pragma once
UCLASS() class EPSILON_API UGameInstanceBase : public UGameInstance { GENERATED_BODY()
public: UGameInstanceBase();
protected: TSharedPtr<FOnlineSessionSearch> SessionSearch;
IOnlineSessionPtr SessionInterface;
protected: virtual void Init() override;
virtual void OnCreateSessionComplete(FName SessionName, bool Succeeded);
virtual void OnFindSessionsComplete(bool Succeeded);
virtual void OnJoinSessionComplete(FName SessionName, EOnJoinSessionCompleteResult::Type Result);
UFUNCTION(BlueprintCallable)
void CreateServer();
UFUNCTION(BlueprintCallable)
void JoinServer();
};
Game Instance cpp file
#include "Game/GameInstanceBase.h"
UGameInstanceBase::UGameInstanceBase() {
}
void UGameInstanceBase::Init() { Super::Init();
if (IOnlineSubsystem* subsystem = IOnlineSubsystem::Get())
{
SessionInterface = subsystem->GetSessionInterface();
if (SessionInterface.IsValid())
{
SessionInterface->OnCreateSessionCompleteDelegates.AddUObject(this, &UGameInstanceBase::OnCreateSessionComplete);
SessionInterface->OnFindSessionsCompleteDelegates.AddUObject(this, &UGameInstanceBase::OnFindSessionsComplete);
SessionInterface->OnJoinSessionCompleteDelegates.AddUObject(this, &UGameInstanceBase::OnJoinSessionComplete);
}
}
}
void UGameInstanceBase::OnCreateSessionComplete(FName SessionName, bool Succeeded) { if (Succeeded) { GetWorld()->ServerTravel("/Game/Scenes/General/Lobby?listen"); } }
void UGameInstanceBase::OnFindSessionsComplete(bool Succeeded) { if (Succeeded) { TArray<FOnlineSessionSearchResult> searchResults = SessionSearch->SearchResults;
if (searchResults.Num())
{
SessionInterface->JoinSession(0, FName("Create Session"), searchResults[0]);
}
}
}
void UGameInstanceBase::OnJoinSessionComplete(FName SessionName, EOnJoinSessionCompleteResult::Type Result) { if (APlayerController* playerController = UGameplayStatics::GetPlayerController(GetWorld(), 0)) { FString joinAddress = ""; SessionInterface->GetResolvedConnectString(SessionName, joinAddress);
if (joinAddress != "")
{
playerController->ClientTravel(joinAddress, ETravelType::TRAVEL_Absolute);
}
}
}
void UGameInstanceBase::CreateServer() { UE_LOG(LogTemp, Warning, TEXT("Create Server"));
FOnlineSessionSettings sessionSettings;
sessionSettings.bAllowJoinInProgress = true;
sessionSettings.bIsDedicated = false;
sessionSettings.bIsLANMatch = (IOnlineSubsystem::Get()->GetSubsystemName() == "NULL");
sessionSettings.bShouldAdvertise = true;
sessionSettings.bUsesPresence = true;
sessionSettings.NumPublicConnections = 5;
SessionInterface->CreateSession(0, FName("Create Session"), sessionSettings);
}
void UGameInstanceBase::JoinServer() { SessionSearch = MakeShareable(new FOnlineSessionSearch()); SessionSearch->bIsLanQuery = (IOnlineSubsystem::Get()->GetSubsystemName() == "NULL"); SessionSearch->MaxSearchResults = 1000; SessionSearch->QuerySettings.Set("SEARCH_PRESENCE", true, EOnlineComparisonOp::Equals);
SessionInterface->FindSessions(0, SessionSearch.ToSharedRef());
}