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

Unity Lobbies主机离开时如何触发客户端函数并区分离开原因

区分Unity Lobbies中主动离开与被动被踢(大厅删除)的方案

针对你遇到的问题,这里给出几个可行的实现思路:

1. 本地标记主动离开状态

这是最简单直接的方案:

  • 在客户端代码中定义一个布尔变量,比如_isVoluntaryLeave,默认值为false
  • 当玩家主动点击“离开大厅”按钮时,先将_isVoluntaryLeave设为true,再调用LobbyService.Instance.LeaveLobbyAsync()
  • 在处理断开连接/离开事件(比如OnPlayerLeftLobby或本地网络断开回调)时,检查这个变量:
    • 如果为true,判定为主动离开
    • 如果为false,判定为被动被踢(大厅删除导致)

2. 正确订阅LobbyDeleted事件

你之前订阅事件未触发,大概率是订阅时机或方式不对:

  • 必须在成功加入大厅后,通过获取到的Lobby实例来订阅Deleted事件,而不是提前订阅全局事件
  • 示例代码:
async void JoinLobby()
{
    var lobby = await LobbyService.Instance.JoinLobbyByCodeAsync("你的大厅码");
    lobby.Deleted += OnLobbyDeleted;
}

void OnLobbyDeleted(Lobby lobby)
{
    // 大厅被删除,触发被动离开逻辑
}
  • 注意:如果是通过LobbyService.Instance.SubscribeToLobbyEvents订阅,需要确保传入正确的大厅ID,并且保持订阅直到离开大厅

3. 主机离开前主动通知客户端

利用Networking的ServerRpc在主机断开前发送通知:

  • 在主机脚本中,监听自身的断开事件(比如OnDestroy或网络断开回调),在断开前调用ServerRpc通知所有客户端:
[ServerRpc(RequireOwnership = false)]
void ServerRpc_NotifyLobbyShutdown()
{
    Rpc_OnLobbyShutdown();
}

[ClientRpc]
void Rpc_OnLobbyShutdown()
{
    // 客户端收到通知,标记为被动离开
}
  • 要确保主机在断开连接前完成Rpc的发送,可在主机的退出逻辑中先调用这个ServerRpc,延迟几帧再执行断开操作

4. 断开后异步查询大厅状态

针对你之前“玩家离开后大厅才删除”的问题,可以尝试延迟查询:

  • 在客户端触发离开事件后,启动一个协程,延迟0.5-1秒后调用LobbyService.Instance.GetLobbyAsync(lobbyId)
  • 如果查询返回NotFound错误,说明大厅已被删除,判定为被动离开;如果能查询到大厅,说明是主动离开

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 15:00:04