Unity Networking-UNet中的加法场景加载

Muh*_*han 13 c# multiplayer unity-game-engine unity-networking unity3d-unet

简短说明:我正在我的主场景中加载一个添加场景,它的加载很好,但添加场景的GameObject(包含网络标识组件)正在变得禁用.

详细信息: 我正在通过此代码加载一个附加场景,以便添加一个场景加载到我的服务器和所有工作正常的客户端:

  [ClientRpc]
    public void RpcLoadLevelAcrossNetwork() {
        SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Additive);    
    }
Run Code Online (Sandbox Code Playgroud)

虽然它已将我的场景加载到客户端/服务器,但具有网络标识的对象是禁用的(这是默认行为,因为我检查了Unity UNetSceneObjects,它指出:

加载场景时,将禁用场景中具有NetworkIdentity组件的所有对象; 在客户端和服务器上.然后,当场景完全加载时,将调用NetworkServer.SpawnObjects()来激活这些联网的场景对象.这将在服务器场景完成加载时由NetworkManager自动完成 - 或者可以由用户代码直接调用.

由于文档声明它将自动激活网络标识对象,但它在我的上下文中没有发生.我的场景加载很好,但其网络标识对象不活动.

我做错了什么?

我还试图通过在我新加载的场景中调用NetworkServer.SpawnObjects()来激活我自己 的对象,但它只在服务器端生成对象,同时在客户端显示错误

未找到1个Spawn场景对象的Spawn场景对象找不到2个未找到的Spawn场景对象..... ..

任何Unet冠军可以帮助我吗?

编辑/更新方法:

我已根据添加场景加载的统一论坛讨论更改了我的代码,它在服务器上加载我的附加场景有错误(如下所示),仍然我的客户端的场景网络标识对象被禁用:

错误:

使用无效连接对象调用Ready():conn = null

另一个代码尝试:

 #region AdditiveSceneLoadingSetup

    [Command]//calling this for additive scene load- its start
    public void CmdLoadAdditiveSceneMainCall() {

        RpcLoadAdditiveScene();
        StartCoroutine(LoadAdditiveSceneAtServer());

    }

    [ClientRpc]
    public void RpcLoadAdditiveScene() {
        Debug.Log("RpcLoadAdditiveScene");
        StartCoroutine(LoadAdditiveSceneAtClient());
    }

    public IEnumerator LoadAdditiveSceneAtClient() {
        Debug.Log("LoadAdditiveSceneAtClient");
        yield return SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Additive);
        List<NetworkConnection> networkConnectionList = FindObjectOfType<MyNetworkManagerWithVR>().networkConnectionList;
        for (int i = 0; i < networkConnectionList.Count; i++)
        {
            ClientScene.Ready(networkConnectionList[i]);
        }
        //ClientScene.Ready(this.connectionToServer);//connectionToServer
    }

    public IEnumerator LoadAdditiveSceneAtServer() {
        Debug.Log("LoadAdditiveSceneAtServer");
        NetworkServer.SetAllClientsNotReady();
        yield return SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Additive);
        NetworkServer.SpawnObjects();
    }


    #endregion AdditiveSceneLoadingSetup
Run Code Online (Sandbox Code Playgroud)

Ale*_*shi 1

你解决过这个问题吗?

我的猜测是,在调用 SpawnObjects 之前,您需要等待所有客户端“就绪”(场景加载完成)。