Unity(C#) - 即使使用dontdestroyonload,网络管理器上的脚本也会在场景更改时禁用

时间:2017-04-26 20:26:07

标签: c# unity3d

所以我添加了一个名为" HostGame"的脚本。到我的网络管理员和#34;创建大厅"按下按钮," HostGame"触发启动匹配匹配的功能。当我按下离开游戏按钮时,一个不同的脚本将我从匹配中断开,游戏将更改回大厅场景,但是创建大厅按钮已失去对主机游戏脚本的引用,即使网络管理器从未进行过程。

我添加了一个" OnDisable"活动到#34; HostGame"当它被禁用时写入控制台,这是我按下离开游戏的那一刻" HostGame"被禁用了。

有什么想法吗?

由于

1 个答案:

答案 0 :(得分:0)

如果我说得对,你在大厅场景中的GameObject N上安装了NetworkManager,并设置了Dont Destroy On Load属性。 此外,您在场景中有另一个GameObject R,引用N

现在发生这种情况:

  • 游戏开始
  • 你在" Lobby.scene"
  • 登录时
    • 所有内容" Lobby.scene"除了GameObject N(因为DontDestroyOnLoad)被销毁。
    • NetworkManager加载场景" Game.scene"
  • 游戏运行一段时间
  • 登出时
    • " Game.scene"除了N(因为DontDestroyOnLoad)被销毁。
    • NetworkManager加载场景" Lobby.scene"
    • 你现在有2个GameObjects N#1和N#2和一个NetworkManager,因为原始版本从未被销毁过,但你也加载了一个来自" Lobby.scene&#的新实例34;
    • R已从" Lobby.scene"和参考文献N#2
    • NetworkManager#2执行其Awake(),检测到已有另一个NetworkManager,并销毁自身及其GameObject N#2
    • R现在有一个缺失的引用,因为N#2不再存在

您可以通过将NetworkManager上的LogLevel设置为" Developer"来验证这是否是问题。返回大厅后,您应该在控制台中看到以下日志输出:

 Multiple NetworkManagers detected in the scene. Only one NetworkManager can exist at a time. The duplicate NetworkManager will not be used.

我对这个问题的解决方案通常是在场景中没有NetworkManager,而是在游戏启动时从代码中实例化它。这样我就可以完全控制它的生命周期。