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

调用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编辑器到官方推荐的稳定版本

内容的提问来源于stack exchange,提问作者user21302417

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 04:02:46