【问题标题】:Calling NetworkManager.ServerChangeScene() Destroys Player调用 NetworkManager.ServerChangeScene() 会破坏播放器
【发布时间】:2018-07-12 20:22:20
【问题描述】:

当使用NetworkManager.ServerChangeScene() 从阶段 1 切换到阶段 2 时,玩家会被摧毁并且在阶段 2 加载时不存在。没有错误,场景切换成功。

这是什么原因造成的?

这是我改变场景的代码:

[ServerCallback]
public void LoadOnline (string sceneName) {

    NetworkManager.singleton.ServerChangeScene (sceneName);
}

【问题讨论】:

  • 您是否需要使用DontDestroyOnLoad
  • 您知道,似乎不太可能存在这样一个基本错误。 “玩家”是指游戏中的游戏对象吗?在SceneA中吗?如果是这样,当您加载 SceneB 时,该游戏对象将被销毁。加载 SceneB 时,SceneA 中的所有内容都将被销毁。我假设“阶段 1”是指 Unity Scene。 (如果你的意思是别的 - 对不起!)
  • 您是否可能需要预加载场景? (提到它的无关文章stackoverflow.com/a/35524924/294884
  • 其实这是一篇关于stackoverflow.com/a/35465978/294884的文章
  • 是的,在 Unity 中这很奇怪......从某种意义上说,您可能会争辩说 DEFAULT 应该是“不要破坏”。你为什么要破坏东西?如果您确实想破坏某些东西(例如,“一条路正在改变为另一条路”),当然,您会手动告诉它破坏有问题的第一条路。无论如何............就是这样! :) 希望它以某种方式有所帮助

标签: unity3d unity-networking


【解决方案1】:

为了从第 1 阶段到第 2 阶段保持持久的游戏对象(或玩家),您需要在对象的 Awake 或 Start 方法中添加对 DontDestroyOnLoad 的调用。见https://docs.unity3d.com/ScriptReference/Object.DontDestroyOnLoad.html

这也会对您之前如何设置玩家在场景文件中的位置提出挑战。我一直在使用的一种方法是在每个阶段创建一个带有标签(如 RespawnPoint)的空游戏对象,该标签用于在场景更改后设置玩家的位置(可以在调用 ServerChangeScene 后的某个地方处理)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-29
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2015-05-16
    • 2014-09-19
    • 2018-01-20
    • 1970-01-01
    相关资源
    最近更新 更多