I have a project that uses the EOS Online Subsystem on UE5.4. The ULocalPlayer::GetPreferredUniqueNetId()
function always returns an invalid PreferredUniqueNetId.
Here is the relavent code:
int UMultiplayerSessionsSubsystem::CreateSession(int32 NumPublicConnections, FString MatchType, FString PathToLobby_)
{
if (!OnlineSessionInterface.IsValid())
{
return -1;
}
PathToLobby = PathToLobby_;
auto ExistingSession = OnlineSessionInterface->GetNamedSession(NAME_GameSession);
if (ExistingSession != nullptr)
{
OnlineSessionInterface->DestroySession(NAME_GameSession);
}
OnlineSessionInterface->AddOnCreateSessionCompleteDelegate_Handle(CreateSessionCompleteDelegate);
TSharedPtr<FOnlineSessionSettings> SessionSettings = MakeShared<FOnlineSessionSettings>();
if (!SessionSettings.IsValid())
{
return -1;
}
SessionSettings->bIsDedicated = false;
SessionSettings->bIsLANMatch = false;
SessionSettings->NumPublicConnections = NumPublicConnections;
SessionSettings->bAllowJoinInProgress = true;
SessionSettings->bAllowJoinViaPresence = true;
SessionSettings->bShouldAdvertise = true;
SessionSettings->bUsesPresence = true;
SessionSettings->bUseLobbiesIfAvailable = true;
SessionSettings->bUseLobbiesVoiceChatIfAvailable = true;
SessionSettings->bAllowInvites = true;
SessionSettings->Set(FName("MatchType"), MatchType, EOnlineDataAdvertisementType::ViaOnlineServiceAndPing);
UWorld* World = GetWorld();
if (World == nullptr)
{
return -1;
}
const ULocalPlayer* LocalPlayer = World->GetFirstLocalPlayerFromController();
if (LocalPlayer == nullptr)
{
return -1;
}
FUniqueNetIdRepl PreferredUniqueNetId = LocalPlayer->GetPreferredUniqueNetId();
if (!PreferredUniqueNetId.IsValid())
{
if (GEngine)
{
GEngine->AddOnScreenDebugMessage(
-1,
15.f,
FColor::Red,
FString(TEXT("PreferredUniqueNetId is invalid"))
);
}
UE_LOG(LogTemp, Error, TEXT("PreferredUniqueNetId is invalid"));
return -1;
}
if (!OnlineSessionInterface->CreateSession(*PreferredUniqueNetId, NAME_GameSession, *SessionSettings))
{
if (GEngine)
{
GEngine->AddOnScreenDebugMessage(
-1,
15.f,
FColor::Red,
FString(TEXT("Failed to create session!"))
);
}
UE_LOG(LogTemp, Warning, TEXT("Failed to create session!"));
return -1;
}
return 0;
}
It always runs into the invalid block. Here is the debugging screen:
I wonder why it is always invalid.