13

简短描述:我正在我的 Main Scene 中加载 Additive Scene,它的加载很好,但 Additive 场景的 GameObject(包含Network Identity组件)正在变为 disable

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

  [ClientRpc]
    public void RpcLoadLevelAcrossNetwork() {
        SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Additive);    
    }

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

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

正如文档所述,它将自动激活网络身份对象,但在我的上下文中并没有发生。我的场景加载很好,但它的网络身份对象不活跃。

我做错了什么?

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

未找到 1 的生成场景对象 未找到 2 的生成场景对象 未找到 3 的生成场景对象...... . .

任何 Unet Champion 可以帮助我吗?

编辑/更新方法:

我已经根据关于附加场景加载的统一论坛讨论更改了我的代码,它在服务器上加载我的附加场景时出现错误(如下所示),并且我的客户端的场景网络身份对象仍然被禁用:

错误:

使用无效的连接对象调用 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
4

2 回答 2

2

在这里聚会迟到了,但我也遇到了这个问题,并在这里提出了自己的解决方案:

https://gist.github.com/kristianpd/485fd7d78512a22a80117a2d22664185

问题的核心是SceneId在NetworkIdentitys上重复使用,当你加载另一个场景时,它会与当前NetworkIdentity.sceneIds冲突。

有关该解决方案的更多背景信息,我在此论坛帖子中进行了一些不同的尝试,然后再进行此解决方案。

https://forum.unity.com/threads/additive-scene-loading-with-unet-conflicting-sceneids-on-scene-objects.525410/#post-3545410

于 2018-07-04T02:10:20.373 回答
1

你有没有解决过这个问题?

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

于 2017-02-07T21:33:33.383 回答