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

Posted

技术标签:

【中文标题】Unity Networking-UNet 中的附加场景加载【英文标题】:Additive scene loading in Unity Networking-UNet 【发布时间】:2017-06-14 00:57:43 【问题描述】:

简短说明:我正在加载一个附加场景在我的主场景中,它的加载很好但附加场景的游戏对象(包含网络身份组件)正在禁用

详情: 我正在通过此代码加载附加场景,以便将附加场景加载到我的服务器和所有运行良好的客户端中:

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

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

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

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

我做错了什么?

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

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

任何 Unet Champion 可以帮助我吗?

编辑/更新方法:

我已经根据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

【问题讨论】:

我对 unity3d 或您正在使用的其他东西一无所知,但 SceneManager.LoadSceneAsync 对我来说似乎很可疑。您不应该以某种方式使用返回的AsyncOperation 以确定加载结果吗? @grek40 我想这条线没有问题,它完美地加载了场景。 很公平,因此您的问题中包含的唯一代码是 3 行代码,您可以确定这不是问题所在。如前所述,我无法评论技术细节,只能确保基础没有错。那么您如何将AsyncOperation 存储在某个地方,以确保它的isDone 属性在您认为的时间真正设置。 是否可以在没有异步的情况下加载您的场景,以查看在这种情况下 SceneObjects 是否变为活动状态? 另外,你读过这个吗? forum.unity3d.com/threads/… 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

你解决过这个问题吗?

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

【讨论】:

感谢您的评论,但这不是正确的地方:)。我还没有解决这个问题。仍然愿意它的解决方案。是的,我试过了,你检查我的代码了吗?

以上是关于Unity Networking-UNet 中的附加场景加载的主要内容,如果未能解决你的问题,请参考以下文章

Unity护盾效果笔记

政府机构债券的附可买回权(Callable)债券

OnUpdate 在 Android Widget 中的 onReceive 之前调用

虚拟机中的运行时栈帧

伸展树(splay tree)

Unity 中的渲染顺序