Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Unity网络UNet中的加性场景加载_C#_Unity3d_Multiplayer_Unity Networking_Unity3d Unet - Fatal编程技术网

C# Unity网络UNet中的加性场景加载

C# Unity网络UNet中的加性场景加载,c#,unity3d,multiplayer,unity-networking,unity3d-unet,C#,Unity3d,Multiplayer,Unity Networking,Unity3d Unet,简短描述:我正在主场景中加载一个附加场景,其加载很好,但附加场景的游戏对象(包含网络标识组件)正在禁用 详细信息: 我正在通过此代码加载附加场景,以便将附加场景加载到我的服务器和所有工作正常的客户端: [ClientRpc] public void RpcLoadLevelAcrossNetwork() { SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Additive); } 虽然它已将我

简短描述:我正在主场景中加载一个附加场景,其加载很好,但附加场景的游戏对象(包含网络标识组件)正在禁用

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

  [ClientRpc]
    public void RpcLoadLevelAcrossNetwork() {
        SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Additive);    
    }
虽然它已将我的场景加载到客户端/服务器中,但使用的对象已禁用(这是默认行为,因为我选中了Unity,它声明:

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

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

我做错了什么

我还试图通过调用新加载的场景来激活对象,但它只在服务器端生成对象,而在客户端显示错误

找不到1的繁殖场景对象 找不到2的繁殖场景对象 找不到3…的繁殖场景对象

有哪个Unet冠军能帮我吗

编辑/更新方法:

 #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
我已根据添加场景加载的更改了代码,其在服务器上加载添加场景时出错(如下所示),但客户端的场景网络标识对象仍处于禁用状态:

错误:

 #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
使用无效的连接对象调用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
#区域添加卸载设置
[命令]//调用此命令以进行附加场景加载-其开始
public void CmdLoadAdditiveSceneMainCall(){
RpcLoadAdditiveScene();
Start例程(LoadAdditiveSceneAtServer());
}
[客户端RPC]
公共无效RpcLoadAdditiveScene(){
Log(“RpcLoadAdditiveScene”);
Start例程(LoadAdditiveSceneAtClient());
}
公共IEnumerator LoadAdditiveSceneAtClient(){
Log(“LoadAdditiveSceneAtClient”);
收益返回场景管理器.LoadSceneAsync(场景名称,LoadSceneMode.Additional);
List networkConnectionList=FindObjectOfType()。networkConnectionList;
for(int i=0;i
你解决过这个问题吗


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

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

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

关于这个解决方案的更多内容,在讨论这个解决方案之前,我将在这个论坛帖子中介绍一些不同的尝试


我对unity3d或其他你正在使用的东西一无所知,但是
SceneManager.LoadSceneAsync
看起来很可疑。你不应该使用返回的
AsyncOperation
来确定加载结果吗?@grek40我想这行没有问题,它加载的是场景pe很明显。很公平,所以你的问题中包含的唯一代码是一个3行程序,你可以确定它不是问题所在。如前所述,我不能评论技术细节,只能确保基本没有问题。那么,你如何将
异步操作
存储在某个地方,以确保它的
isDone
属性是r在您认为合适的时间进行设置。是否可以在不使用异步的情况下加载场景,只是为了查看场景对象在这种情况下是否处于活动状态?另外,您是否阅读了此内容?感谢您的介绍,但这不是正确的位置:)。我还没有解决这个问题。仍然愿意找到解决办法。是的,我试过了,你检查过我的代码了吗?