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

时间:2017-01-28 11:34:20

标签: c# unity3d multiplayer unity-networking unity3d-unet

简短描述:我正在我的主场景中加载添加场景,其加载正常但添加场景的GameObject(包含网络标识)组件)成为禁用

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

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

虽然它已将我的场景加载到客户端/服务器,但是network identity的对象被禁用(这是默认行为,因为我检查了Unity UNetSceneObjects,其中声明:

  

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

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

我做错了什么?

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

  

找不到1的Spawn场景对象   未找到2的产卵场景对象   没有找到3 .....的产卵场景对象。 。

任何Unet冠军能帮助我吗?

编辑/更新方法:

我根据加法场景加载的unity forum discussion更改了我的代码,它在服务器上加载了我的附加场景并出现错误(如下所示),并且我的客户端的场景网络标识对象仍被禁用:

错误:

  

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

2 个答案:

答案 0 :(得分:2)

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

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

问题的核心是在NetworkIdentity上重新使用SceneId,并且当您加载另一个场景时,它将与当前NetworkIdentity.sceneId上冲突。

有关该解决方案的更多背景信息,在该论坛帖子中,我将在介绍该解决方案之前进行几次尝试。

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

答案 1 :(得分:1)

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

我的猜测是你需要在调用SpawnObjects之前等待所有客户端'Ready'(场景加载完成)。

相关问题