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
SceneManager.LoadSceneAsync
looks suspicious to me. Shouldn't you work with the returnedAsyncOperation
somehow in order to determine the loading result? – PunditAsyncOperation
somewhere just to ensure that itsisDone
property is really set at the time you think it is. – Pundit