You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 20:12:46