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

Unity+Google Play Games:如何为两名玩家加载同步场景?

解决多人游戏中双玩家同步加载并实例化相同场景的问题

嘿,这个问题我之前帮不少开发者踩过坑——你现在的核心误区就是让每个玩家各自触发场景加载,这肯定会导致两边的场景实例完全独立,根本没法同步。得换个思路:让**权威端(服务器/主机)**来主导整个场景加载流程,然后把场景状态同步给所有客户端。下面分通用逻辑和主流框架的具体实现来给你讲清楚:


通用核心逻辑

不管用什么多人框架,核心原则都是一致的:

  • 确定唯一权威端:指定服务器(NGO)或房间主客户端(Photon)作为“说了算”的角色,所有场景加载、对象操作都由它发起。
  • 禁用客户端自主加载:把玩家本地触发场景加载的逻辑去掉,改成向权威端发送请求,或者直接由权威端在全员进入房间后自动触发加载。
  • 同步场景与对象状态:权威端加载完成后,自动把场景内所有对象的初始状态同步给客户端;后续的对象销毁/交互操作,也必须先请求权威端,再由权威端同步给所有人。

主流框架具体实现

一、Netcode for GameObjects(Unity官方推荐)

  1. 配置可同步场景
    打开Unity编辑器的 Window > Multiplayer > Network Scene Manager,把你要同步的场景添加到Networked Scenes列表中。同时,场景内所有需要同步的对象都要添加NetworkObject组件,勾选Spawnable(动态实例化的对象需要这个)。

  2. 服务器主导场景加载
    只有服务器能调用场景加载方法,客户端只负责接收同步:

    using Unity.Netcode;
    using UnityEngine.SceneManagement;
    
    public class SceneLoader : NetworkBehaviour
    {
        // 房间全员就绪后,服务器调用这个方法
        public void LoadGameScene()
        {
            if (!IsServer) return; // 确保只有服务器执行
            NetworkManager.Singleton.SceneManager.LoadScene("GameScene", LoadSceneMode.Single);
        }
    }
    

    客户端可以监听加载进度来处理UI:

    void Start()
    {
        NetworkManager.Singleton.SceneManager.OnSceneEvent += OnSceneLoadEvent;
    }
    
    private void OnSceneLoadEvent(SceneEvent sceneEvent)
    {
        if (sceneEvent.SceneEventType == SceneEventType.LoadComplete)
        {
            // 隐藏加载界面、初始化本地玩家逻辑
        }
    }
    
  3. 同步对象销毁操作
    点击对象时,客户端先向服务器发请求,由服务器执行销毁并同步:

    using Unity.Netcode;
    
    public class ClickableObject : NetworkBehaviour
    {
        void OnMouseDown()
        {
            if (IsClient) // 只有客户端发起请求
            {
                DestroyObjectServerRpc();
            }
        }
    
        [ServerRpc(RequireOwnership = false)]
        private void DestroyObjectServerRpc()
        {
            // 服务器执行销毁,自动同步给所有客户端
            NetworkObject.Despawn();
            Destroy(gameObject);
        }
    }
    

二、Photon PUN 2

  1. 主客户端主导场景加载
    只有房间创建者(Master Client)能触发场景加载,开启自动同步场景选项:

    using Photon.Pun;
    using UnityEngine.SceneManagement;
    
    public class PhotonSceneLoader : MonoBehaviourPunCallbacks
    {
        public void LoadGameScene()
        {
            if (PhotonNetwork.IsMasterClient)
            {
                PhotonNetwork.LoadLevel("GameScene");
            }
        }
    }
    

    记得在PhotonServerSettings里勾选AutoSyncScene,这样客户端会自动同步主客户端加载的场景。

  2. 同步对象销毁操作
    给可点击对象添加PhotonView组件,通过RPC请求主客户端销毁:

    using Photon.Pun;
    
    public class ClickablePhotonObject : MonoBehaviourPunCallbacks
    {
        void OnMouseDown()
        {
            photonView.RPC("RequestDestroyObject", RpcTarget.MasterClient);
        }
    
        [PunRPC]
        private void RequestDestroyObject()
        {
            if (PhotonNetwork.IsMasterClient)
            {
                PhotonNetwork.Destroy(gameObject); // 主客户端销毁,同步给所有人
            }
        }
    }
    

关键注意事项

  • 静态对象同步:场景里的静态对象如果需要同步状态,必须添加对应的网络组件(NGO的NetworkObject、Photon的PhotonView),否则客户端不会同步这些对象。
  • 加载时机:一定要等所有玩家都加入房间后,再由权威端触发场景加载,避免部分玩家错过同步流程。
  • 避免重复操作:严格禁止客户端直接执行场景加载或对象销毁,所有操作必须经过权威端验证后同步。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:07:38