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

Unity中使用Photon PUN2同步Spawn生成的游戏对象问题

解决Photon PUN2中生成Box的同步与持久化问题

核心问题排查与修复步骤

1. 先把Prefab的配置搞对

你的PickableCube预制体必须满足这些要求:

  • 挂PhotonView组件,Observed Components要选PhotonTransformView(别用默认的Transform)
  • PhotonTransformView组件至少勾选同步位置(需要同步旋转/缩放也可以一起开)
  • PhotonView的View ID留空就行,运行时Photon会自动分配
  • 预制体必须放在Resources目录下(PhotonNetwork.Instantiate只能加载Resources里的资源,你写的"PhotonPrefabs/PickableCube"路径,得确保这个文件夹在Resources里面)

2. 限制生成权限,避免重复创建

现在所有玩家触发触发器都会调用SpawnBox,会导致多端重复生成。得让只有**主客户端(Master Client)**执行生成操作:

private void SpawnBox()
{
    // 只有主客户端能生成,保证全局只创建一次
    if (!PhotonNetwork.IsMasterClient) return;
    
    // 路径是Resources下的相对路径,不用带Resources前缀
    PhotonNetwork.Instantiate("PhotonPrefabs/PickableCube", transform.position, Quaternion.identity);
}

private void OnTriggerEnter(Collider other) 
{ 
    if (other.CompareTag("Player")) 
    { 
        SpawnBox(); 
    } 
}

3. 让生成的Box不受玩家退出影响

默认情况下,Photon生成的对象会跟着创建它的玩家一起销毁。要让Box独立存在,把它的所有权转给场景就行:

private void SpawnBox()
{
    if (!PhotonNetwork.IsMasterClient) return;
    
    GameObject spawnedBox = PhotonNetwork.Instantiate("PhotonPrefabs/PickableCube", transform.position, Quaternion.identity);
    // 把对象所有权转给场景,玩家退出就不会销毁它了
    PhotonView boxView = spawnedBox.GetComponent<PhotonView>();
    if (boxView != null)
    {
        boxView.TransferOwnership(null);
    }
}

4. 验证效果

  • 开至少两个客户端,触发触发器后看两边是不是都能看到Box
  • 退出其中一个客户端,检查另一个客户端的Box还在不在

额外提醒

  • 触发器所在的对象不用挂PhotonView,本地检测就行,但生成逻辑必须由主客户端执行
  • 多看控制台的Photon报错,比如资源找不到、权限不够的提示,这些能快速定位问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 07:52:46