调用Unity QueryLobbiesAsync()导致编辑器冻结问题求助
Unity Lobby服务QueryLobbiesAsync导致编辑器冻结无响应
我正在开发大厅菜单用于展示所有开放大厅,但每次启动游戏时Unity编辑器直接冻结,无任何错误、警告提示,只能通过任务管理器强制结束进程。调试定位到冻结发生在LobbyManager.cs的这行代码:
QueryResponse queryResponse = await Lobbies.Instance.QueryLobbiesAsync(OptionsFactory.QueryLobbiesOptions());
即使不传QueryLobbiesOptions参数,编辑器依然会冻结。尝试过直接获取结果列表的写法,问题依旧:
List<Lobby> lobbyList = (await Lobbies.Instance.QueryLobbiesAsync(OptionsFactory.QueryLobbiesOptions())).Results; foreach (var lobby in lobbyList) { Debug.Log(lobby.Name); }
QueryLobbiesAsync是Unity内置的Lobby服务方法,实现位于WrappedLobbyService.cs,我在LobbyManager.cs的ListLobbies方法中调用该接口。
相关代码片段
OptionsFactory.cs
public static QueryLobbiesOptions QueryLobbiesOptions() { QueryLobbiesOptions queryLobbiesOptions = new QueryLobbiesOptions { Count = 10, Filters = new List<QueryFilter> { new QueryFilter(QueryFilter.FieldOptions.AvailableSlots, "0", QueryFilter.OpOptions.GT) }, Order = new List<QueryOrder> { new QueryOrder(false, QueryOrder.FieldOptions.Created) } }; return queryLobbiesOptions; }
WrappedLobbyService.cs(Unity内置代码)
/// <inheritdoc/> public async Task<QueryResponse> QueryLobbiesAsync(QueryLobbiesOptions options = default) { var queryRequest = options == null ? null : new QueryRequest(options.Count, options.Skip, options.SampleResults, options.Filters, options.Order, options.ContinuationToken); var queryLobbiesRequest = new QueryLobbiesRequest(queryRequest); var response = await TryCatchRequest(m_LobbyService.LobbyApi.QueryLobbiesAsync, queryLobbiesRequest); return response.Result; }
LobbyManager.cs的ListLobbies方法
public async Task<List<Lobby>> ListLobbies() { try { QueryResponse queryResponse = await Lobbies.Instance.QueryLobbiesAsync(OptionsFactory.QueryLobbiesOptions()); List<Lobby> lobbyList = (await Lobbies.Instance.QueryLobbiesAsync(OptionsFactory.QueryLobbiesOptions())).Results; foreach (var lobby in lobbyList) { Debug.Log(lobby.Name); } } catch (LobbyServiceException e) { Debug.Log(e); return null; } return null; }
可能的解决方向
避免主线程同步等待异步方法
Unity主线程若被异步操作阻塞(比如误用.Result或.Wait()),会直接导致编辑器冻结。检查调用ListLobbies的代码,确保用异步链式调用而非同步等待:// 错误写法:主线程同步等待引发死锁 List<Lobby> lobbies = lobbyManager.ListLobbies().Result; // 正确写法:保持异步流程 async void InitLobbyList() { List<Lobby> lobbies = await lobbyManager.ListLobbies(); // 后续处理大厅列表逻辑 }同时优化
ListLobbies方法,去掉重复的API调用:public async Task<List<Lobby>> ListLobbies() { try { QueryResponse queryResponse = await Lobbies.Instance.QueryLobbiesAsync(OptionsFactory.QueryLobbiesOptions()); List<Lobby> lobbyList = queryResponse.Results; foreach (var lobby in lobbyList) { Debug.Log(lobby.Name); } return lobbyList; // 原方法返回null不合理,改为返回有效列表 } catch (LobbyServiceException e) { Debug.LogError(e); // 改用Error级别日志,更容易排查问题 return null; } }确认Lobby服务初始化状态
调用QueryLobbiesAsync前,确保Lobby服务已完成初始化:void Awake() { if (!Lobbies.Instance.IsInitialized) { Debug.LogError("Lobby服务未完成初始化!"); return; } }绑定Unity主线程异步上下文
显式指定ConfigureAwait(true),确保异步操作回调回到Unity主线程:QueryResponse queryResponse = await Lobbies.Instance.QueryLobbiesAsync(OptionsFactory.QueryLobbiesOptions()).ConfigureAwait(true);排查网络与服务端配置
- 切换网络环境(如手机热点)测试是否为网络堵塞问题
- 检查Unity Dashboard中Lobby服务是否正常启用
- 验证Project ID及服务配置是否正确
- 打包后运行游戏,排查是否仅编辑器环境出现冻结
更新Unity与Lobby包版本
旧版本Unity或Lobby包可能存在已知死锁bug,尝试更新至最新稳定版:- 在Package Manager中更新
com.unity.services.lobbies包 - 升级Unity编辑器到官方推荐的稳定版本
- 在Package Manager中更新
内容的提问来源于stack exchange,提问作者user21302417
相关产品推荐
相关产品推荐

