You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Unity Pun2开发:非主机客户端OnJoinedRoom方法未调用问题求助

解决Unity Pun2中OnJoinedRoom()仅主机触发的问题

这是Pun2开发里很常见的回调不一致问题,我帮你拆解几个核心原因和对应的解决办法:

1. 先确认回调的基础配置是否到位

你的脚本必须继承自MonoBehaviourPunCallbacks(不是普通的MonoBehaviour),否则Pun2的回调系统根本找不到它。另外,一定要在脚本的生命周期里注册/注销回调目标,很多人会漏掉这一步:

void OnEnable()
{
    PhotonNetwork.AddCallbackTarget(this);
}

void OnDisable()
{
    PhotonNetwork.RemoveCallbackTarget(this);
}

没加这段的话,非主机客户端的回调事件大概率不会被监听触发。

2. 检查场景同步的关键设置

你在主机的OnJoinedRoom里直接调用了PhotonNetwork.LoadLevel("RoomFor1"),这里有两个必须确认的点:

  • 打开PhotonServerSettings,务必勾选AutoSyncScene选项。这个开关会让所有已加入房间的客户端自动同步主机加载的场景,如果没开,其他客户端会留在初始场景,主机已经进入新场景,两边的回调上下文直接脱节了。
  • 确保RoomFor1场景已经添加到Unity的Build Settings列表里,否则其他客户端加载场景会失败,直接打断后续的回调流程。

3. 避免场景切换打断回调触发

主机在加入房间后立刻加载场景,可能会导致非主机客户端还没完成房间加入的全流程,就被强制切换场景,打断了OnJoinedRoom的触发。你可以调整下逻辑:

public override void OnJoinedRoom()
{
    // 主机负责触发场景加载,依赖AutoSyncScene同步给其他客户端
    if (PhotonNetwork.IsMasterClient)
    {
        PhotonNetwork.LoadLevel("RoomFor1");
    }
    // 非主机客户端在这里做加入后的初始化操作,比如更新UI
    Debug.Log("成功加入房间,当前玩家数:" + PhotonNetwork.CurrentRoom.PlayerCount);
}

另外,挂载这个回调脚本的GameObject,建议加上DontDestroyOnLoad,防止场景切换时脚本被销毁:

void Awake()
{
    DontDestroyOnLoad(gameObject);
}

4. 验证房间加入流程的正确性

确保非主机客户端是用正确的API加入房间的,比如PhotonNetwork.JoinRoom(roomName),而不是误用了其他方法。同时可以在客户端的OnJoinRoomFailedOnConnectedToMaster里加Debug日志,排查是不是房间加入流程本身出了问题,而不是回调没触发。

内容的提问来源于stack exchange,提问作者이정태

火山引擎 最新活动