Short Description: 我正在加载一个 Additive Scene in my Main scene ,它的加载很好但是Additive场景的GameObject(包含 Network Identity Component)是 becoming disable .
Details: 我正在通过此代码加载一个附加场景,以便添加一个场景加载到我的服务器和所有工作正常的客户端:
[ClientRpc]
public void RpcLoadLevelAcrossNetwork() {
SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Additive);
}
虽然它已将我的场景加载到客户端/服务器但是具有network identity的对象被禁用(这是默认行为,因为我检查了Unity UNetSceneObjects,其中指出:
加载场景时,将禁用场景中具有NetworkIdentity组件的所有对象;在客户端和服务器上 . 然后,当场景完全加载时,将调用NetworkServer.SpawnObjects()来激活这些联网的场景对象 . 这将在服务器场景完成加载时由NetworkManager自动完成 - 或者可以由用户代码直接调用 .
由于文档声明它将自动激活网络标识对象,但它在我的上下文中没有发生 . 我的场景加载很好,但其网络标识对象不活动 .
我做错了什么?
我也尝试通过在我的新加载场景中调用NetworkServer.SpawnObjects()来激活我自己的对象,但它只在服务器端产生对象,同时在客户端显示错误
找不到1个Spawn场景对象的Spawn场景对象找不到2个未找到的Spawn场景对象..... ..... . .
任何Unet冠军可以帮助我吗?
EDIT/UPDATED Approach:
我根据unity forum discussion更改了我的代码,用于添加场景加载,它在服务器上加载我的附加场景有错误(如下所示),并且我的客户端的场景网络标识对象仍被禁用:
Error:
使用无效连接对象调用Ready():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
2 回答
你有没有解决过这个问题?
我的猜测是你需要在调用SpawnObjects之前等待所有客户端'Ready'(场景加载完成) .
迟到了这里的派对,但我也碰到了这个,并在这里提出了我自己的解决方案:
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