UE5多人游戏:通过FSessionSettings传递服务器名称编译报错求助
解决Unreal Engine 5中通过FSessionSettings传递并显示服务器名称的编译错误
一、编译错误的核心原因
- 直接给
FOnlineSessionSetting.Data赋值时未指定数据类型和广告属性,Unreal的在线会话设置需要明确这些参数才能完成序列化/反序列化 const FName NullName = "NULL";初始化方式不规范,Unreal中FName需用TEXT()宏包裹字符串- 获取会话设置时未处理
FindRef可能返回空值的情况,存在潜在崩溃风险
二、修正后的会话设置代码
void UMultiplayerSessionSubsystem::ConfigureSessionSettings(UMultiplayerDataAsset* DataAsset) { IOnlineSubsystem* OnlineSubsystem = IOnlineSubsystem::Get(); if (!OnlineSubsystem) { UE_LOG(LogTemp, Error, TEXT("Online Subsystem is null!")); return; } const FName SubsystemName = OnlineSubsystem->GetSubsystemName(); const FName NullName = FName(TEXT("NULL")); SessionSettings = MakeShareable(new FOnlineSessionSettings()); SessionSettings->NumPublicConnections = DataAsset->MaxPlayersCount; SessionSettings->NumPrivateConnections = DataAsset->MaxPlayersCount; SessionSettings->bIsLANMatch = SubsystemName == NullName; SessionSettings->bIsDedicated = false; SessionSettings->bAllowJoinInProgress = true; SessionSettings->bAllowJoinViaPresence = true; SessionSettings->bUseLobbiesIfAvailable = true; SessionSettings->bShouldAdvertise = true; SessionSettings->bUsesPresence = true; SessionSettings->bAllowInvites = true; // 正确初始化会话名称设置:指定数据类型、广告属性、赋值 FOnlineSessionSetting SessionNameSetting; SessionNameSetting.Data = DataAsset->OwnerPlayerName; SessionNameSetting.AdvertisementType = EOnlineDataAdvertisementType::ViaOnlineServiceAndPing; SessionNameSetting.SetDataType(FString::StaticStruct()); SessionSettings->Settings.Add(FName(TEXT("SESSION_NAME")), SessionNameSetting); SessionSettings->Set(FName(TEXT("MatchType")), DataAsset->GameTypeName.ToString(), EOnlineDataAdvertisementType::ViaOnlineServiceAndPing); }
三、安全获取服务器名称的代码
// 遍历搜索结果时的安全获取逻辑 for (int32 i = 0; i < LastSessionSearch->SearchResults.Num(); ++i) { const FOnlineSessionSearchResult& Result = LastSessionSearch->SearchResults[i]; FString SessionName = TEXT("Unnamed Server"); // 先检查设置是否存在,避免空引用 const FName SessionNameKey = FName(TEXT("SESSION_NAME")); if (Result.Session.SessionSettings.Settings.Contains(SessionNameKey)) { const FOnlineSessionSetting& Setting = Result.Session.SessionSettings.Settings[SessionNameKey]; // 验证数据有效性和类型匹配 if (Setting.Data.IsValid() && Setting.Data.GetType() == FString::StaticStruct()) { SessionName = *Setting.Data.GetValue<FString>(); } } UE_LOG(LogTemp, Warning, TEXT("SERVER NAME: %s"), *SessionName); // 此处可将SessionName绑定到UI控件,实现会话列表显示 }
四、关键注意事项
- 确保
DataAsset->OwnerPlayerName是有效的FString类型,避免空字符串 - 在线子系统(如Steam、EOS)需正确配置,否则会话设置无法跨客户端同步
- 测试优先用LAN模式(Null子系统)验证功能,再切换到正式在线服务
内容的提问来源于stack exchange,提问作者Infinix Gaming
相关产品推荐
相关产品推荐

