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

Unity Photon中OnDisconnected回调函数无法执行代码问题求助

问题分析

你遇到的核心问题是:调用PhotonNetwork.Disconnect()后,客户端已经和Photon服务器完全断开连接,此时OnDisconnected回调里的RPC调用(pv.RPC("LeftPhoton", RpcTarget.All, myPlayer.ViewID))根本无法发送到其他客户端——因为网络连接已经终止,RPC依赖的网络通道不存在了。

而OnLeftLobby能正常执行,是因为这个回调触发时,客户端只是离开大厅,但还没彻底断开与服务器的连接,此时网络通道还存在,相关代码可以正常运行。

解决方案

1. 主动断开时先通知其他客户端,再执行断开

修改你的断开方法,先发送RPC告知所有玩家你要离开,再执行断开操作:

public void DisconnectedPhoton()
{
    // 先发送RPC通知所有客户端
    pv.RPC("LeftPhoton", RpcTarget.All, myPlayer.ViewID);
    // 延迟短时间再断开(确保RPC发送完成,可选但推荐)
    Invoke(nameof(DoDisconnect), 0.1f);
}

private void DoDisconnect()
{
    PhotonNetwork.Disconnect();
}

public override void OnDisconnected(DisconnectCause cause)
{
    // 这里只处理本地客户端断开后的逻辑,比如清理本地UI、重置状态等
    // 不要再尝试发送RPC,因为连接已断
}

2. 处理强制关闭/崩溃的情况

如果是客户端强制关闭(比如进程崩溃、断电),主动发送RPC的方式不可行,这时候需要依赖Photon的自动离线检测机制:

  • 在Photon配置中,确保PlayerTTL(玩家离线后服务器保留其信息的时间)和RoomTTL(空房间保留时间)设置合理(默认值通常可满足需求)。
  • 其他客户端会通过OnPlayerLeftRoom回调检测到玩家离线,在这个回调里执行玩家离开的逻辑:
public override void OnPlayerLeftRoom(Player otherPlayer)
{
    // 根据otherPlayer的标识,执行玩家离开的逻辑
    // 比如移除对应的玩家对象、更新房间UI等
}
关键注意点
  • OnDisconnected回调的作用是处理本地客户端断开后的本地逻辑,而非向其他客户端发送消息——此时网络连接已不存在,跨客户端通信必然失败。
  • 跨客户端的玩家离开通知,要么在连接未断开时提前发送(主动断开场景),要么依赖Photon的自动离线检测触发OnPlayerLeftRoom(被动离线场景)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 05:43:17