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

Unity(C#)-网络管理器上的脚本在场景更改时被禁用,即使使用dontdestroyonload,c#,unity3d,C#,Unity3d,因此,我在我的网络管理器中添加了一个名为“HostGame”的脚本,当按下“创建大厅”按钮时,“HostGame”会触发一个启动配对的函数。当我按下“离开游戏”按钮时,另一个脚本会将我与比赛断开连接,游戏会按原样切换回大厅场景,但是“创建大厅”按钮已失去对主机游戏脚本的引用,即使网络管理员从未离开过 我在“HostGame”中添加了一个“OnDisable”事件,当它被禁用时,该事件会写入控制台,而当我按下leave game时,“HostGame”被禁用 有什么想法吗 谢谢如果我没说错的话,您

因此,我在我的网络管理器中添加了一个名为“HostGame”的脚本,当按下“创建大厅”按钮时,“HostGame”会触发一个启动配对的函数。当我按下“离开游戏”按钮时,另一个脚本会将我与比赛断开连接,游戏会按原样切换回大厅场景,但是“创建大厅”按钮已失去对主机游戏脚本的引用,即使网络管理员从未离开过

我在“HostGame”中添加了一个“OnDisable”事件,当它被禁用时,该事件会写入控制台,而当我按下leave game时,“HostGame”被禁用

有什么想法吗


谢谢

如果我没说错的话,您在大厅场景中的游戏对象
N
上有NetworkManager,它的
属性设置为加载时不要销毁。
另外,场景中还有另一个游戏对象
R
,它引用了
N

现在这种情况发生了:

  • 比赛开始了
  • 你在“大厅,场景”
  • 登录时
    • 除了GameObject
      N
      (由于DontDestroyOnLoad)之外,“lobble.scene”中的所有内容都被销毁
    • NetworkManager加载场景“游戏.场景”
  • 游戏运行一段时间
  • 注销时
    • “Game.scene”中除了
      N
      (由于DontDestroyOnLoad)之外的所有内容都被销毁
    • NetworkManager加载场景“大厅.场景”
    • 你现在有两个游戏对象,一个是NetworkManager,一个是NetworkManager,一个是NetworkManager,一个是NetworkManager,一个是NetworkManager
    • R
      是从“大厅.场景”和参考文件
      N
      #2加载的
    • NetworkManager#2执行其
      Awake()
      ,检测到已有另一个NetworkManager,并销毁其自身及其游戏对象
      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出现在场景中,而是在游戏启动时从代码中实例化它。这样,我就可以完全控制它的生命周期。

场景会带来很多麻烦,因为数据不应该在它们之间持久存在,而执行使对象保持加载状态的操作也会带来麻烦。确保Netowrk管理器没有被复制(或写入试图实例化的现有实例的数据).我刚得到unity提供的networkmanager脚本,作为一个组件添加到一个名为NETMANAGER的空游戏对象中,出于某种原因,它在从大厅切换到游戏时保持一切不变,但在离开游戏并返回大厅时,附加到networkmanager对象的HostGame脚本将变为这些空白脚本之一。