Unreal Engine EOS会话创建成功但其他客户端无法搜索到求助
解决EOS会话创建后无法被其他客户端搜索到的问题
以下是针对你的代码和问题的排查与修复步骤:
1. 确认会话创建是否真的成功(添加创建完成回调的错误检查)
你目前没有实现OnCreateSessionCompleted的完整逻辑,无法确认会话是否无错误创建。添加以下代码,排查会话创建时的潜在错误:
void UEOS_GameInstance::OnCreateSessionCompleted(FName SessionName, bool bWasSuccessful) { if (bWasSuccessful) { UE_LOG(LogTemp, Log, TEXT("会话创建成功: %s"), *SessionName.ToString()); } else { UE_LOG(LogTemp, Error, TEXT("会话创建失败: %s"), *SessionName.ToString()); IOnlineSubsystem* SubsystemRef = Online::GetSubsystem(GetWorld()); if (SubsystemRef) { IOnlineSessionPtr SessionPtr = SubsystemRef->GetSessionInterface(); if (SessionPtr) { FString ErrorStr; SessionPtr->GetLastError()->ToString(ErrorStr); UE_LOG(LogTemp, Error, TEXT("创建错误详情: %s"), *ErrorStr); } } } }
2. 修正会话创建的可见性设置
当前会话设置缺少允许公开发现的关键参数,修改创建会话的FOnlineSessionSettings配置:
FOnlineSessionSettings SessionCreationInfo; SessionCreationInfo.bIsDedicated = bIsDedicatedServer; SessionCreationInfo.bAllowInvites = true; SessionCreationInfo.bIsLANMatch = bIsLanServer; SessionCreationInfo.NumPublicConnections = NumberOfPublicConnections; // 先禁用Lobby关联,排除干扰,测试成功后再开启 SessionCreationInfo.bUseLobbiesIfAvailable = false; SessionCreationInfo.bUsesPresence = true; SessionCreationInfo.bShouldAdvertise = true; // 新增:允许非好友通过在线服务发现会话 SessionCreationInfo.bAllowJoinViaPresence = true; SessionCreationInfo.bAllowJoinViaPresenceFriendsOnly = false; SessionCreationInfo.Set(SEARCH_KEYWORDS, FString("RandonHi"), EOnlineDataAdvertisementType::ViaOnlineServiceAndPing);
3. 修正会话搜索的过滤条件
当前搜索代码清空了所有参数,且未匹配创建时的关键词或存在状态,修改FindSessionAndJoin方法:
void UEOS_GameInstance::FindSessionAndJoin() { UE_LOG(LogTemp, Warning, TEXT("尝试查找会话")); IOnlineSubsystem* SubsystemRef = Online::GetSubsystem(this->GetWorld()); FString SubsystemName = SubsystemRef->GetSubsystemName().ToString(); UE_LOG(LogTemp, Warning, TEXT("当前子系统: %s"), *SubsystemName); if (SubsystemRef) { IOnlineSessionPtr SessionPtrRef = SubsystemRef->GetSessionInterface(); if (SessionPtrRef) { UE_LOG(LogTemp, Warning, TEXT("生成搜索查询")); SessionSearch = MakeShareable(new FOnlineSessionSearch()); SessionSearch->bIsLanQuery = false; SessionSearch->MaxSearchResults = 20; // 不要清空默认搜索参数,保留EOS所需的基础过滤 // SessionSearch->QuerySettings.SearchParams.Empty(); // 匹配创建会话时设置的关键词 SessionSearch->QuerySettings.Set(SEARCH_KEYWORDS, FString("RandonHi"), EOnlineComparisonOp::Equals); // 搜索启用了Presence的会话(与创建时的bUsesPresence=true对应) SessionSearch->QuerySettings.Set(SEARCH_PRESENCE, true, EOnlineComparisonOp::Equals); SessionPtrRef->OnFindSessionsCompleteDelegates.AddUObject(this, &UEOS_GameInstance::OnFindSessionCompleted); SessionPtrRef->FindSessions(0, SessionSearch.ToSharedRef()); } } }
4. 环境与权限检查
- 确保所有测试客户端都登录了有效的EOS账号,且处于同一环境(Sandbox/Production),与EOS开发者门户显示的会话环境一致。
- 检查EOS开发者门户的游戏权限设置,确认会话相关的权限(如会话发现、加入)已启用。
- 查看UE日志中的
EOS相关条目,排查SDK返回的错误码,定位网络或配置问题。
内容的提问来源于stack exchange,提问作者InfJ
相关产品推荐
相关产品推荐

