Additive scene loading in Unity Networking-UNet

2019-04-19 06:51发布

问题:

Short Description: I am loading an Additive Scene in my Main scene, its loading fine but Additive scene's GameObject (that contain Network Identity Component) are becoming disable.

Details: I am loading an additive scene through this code so that an additive scene become load into my server and all clients which working fine:

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

Although it has loaded my scene into clients/server but the object that are with network identity are disable (It is default behavior as I checked Unity UNetSceneObjects which states that:

All objects in the scene with a NetworkIdentity component will be disabled when the scene is loaded; on both the client and the server. Then, when the scene is fully loaded, NetworkServer.SpawnObjects() is called to activate these networked scene objects. This will be done automatically by the NetworkManager when the server scene finishes loading - or can be called directly by user code.

As documentation state that it will automatically activate the Network Identity objects but it did not happen in my context. My scene loading is fine but its network identity objects are not active.

What I am doing wrong?

I also tried to activate the object my self through calling NetworkServer.SpawnObjects() in my new loaded scene but it only spawning the object on server side while showing the error at client

Spawn scene object not found for 1 Spawn scene object not found for 2 Spawn scene object not found for 3..... . . .

Can any Unet Champion help me?

EDIT/UPDATED Approach:

I have changed my code according to the unity forum discussion for additive scene loading, its loading my additive scene on server with error (given below) and still my client side's scene network identity objects are disabled:

Error:

Ready() called with invalid connection object: conn=null

Another Code Try:

 #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

回答1:

Did you ever solve this?

My guess would be that you need to wait for all clients to be 'Ready' (scene load finished) before calling SpawnObjects.



回答2:

Late to the party here, but I ran into this as well and came up with my own solution here:

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

The core of the problem is that the SceneId's are re-used on NetworkIdentitys and when you load another scene, it will conflict with current NetworkIdentity.sceneIds.

For a little more context on the solution, this forum post is where I walk through a few different attempts before coming to this solution.

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