【问题标题】:How to change scene in Unity when called from listener?从侦听器调用时如何更改 Unity 中的场景?
【发布时间】:2017-04-16 03:15:53
【问题描述】:

因此,正如我在这里被告知的那样,我不能从 Update() 函数中调用场景更改。好的,不然怎么实现场景切换逻辑?

例如,在 Update() 内部,我正在侦听来自服务器的响应和请求:

private void Update() {

// A bunch of parsing stuff

switch (DataFromServer) {

   case "ServerAllowedSceneChange":

      SceneManager.LoadScene(DataFromServer[2]);
      break;

   }

}

这就是我对实现逻辑的看法,然而,Unity 似乎不是这样做的。有人可以建议如何以 Unity 的工作方式做类似的事情:)

这个方法的缺点是,当我这样称呼它时,场景还没有准备好使用。在场景更改调用之后,我尝试访问尚不存在的对象。并且所有对关卡完成加载的检查都不起作用。

如果我们回到代码示例,如果我这样做:

switch (DataFromServer) {

   case "ServerAllowedSceneChange":

      SceneManager.LoadScene(DataFromServer[2]);
      GameObject objectFromSceneImSwithcingTo = GameObject.Find("objectFromSceneImSwithcingTo").gameObject;
      break;

   }

我从 Unity 收到 NullReference 错误。

【问题讨论】:

  • 你在哪里读到你不能从更新中做到这一点?请阅读this。它还解释了场景将在新帧开始时加载。
  • @Logman stackoverflow.com/questions/43420223/… 别误会 - 它会加载新场景,但我还无法访问其中的对象。我尝试等待帧结束,并等待启动协程的任何秒数 - 不起作用
  • 请阅读您提供的答案;)。您无法访问新场景属性,因为加载新场景时旧场景已被销毁。
  • 没错,但脚本在加载时不会被破坏,并且对象来自新场景。所以当我要求访问时,场景应该已经加载并且脚本在“DontDestroyOnLoad”部分运行
  • 澄清您无法在 LoadScene 之后访问新场景,因为此时场景实际上并未加载。如果我记得即使您使用 DontDestroyOnLoad 创建对象,场景更改后正确的协程也会停止。

标签: c# unity3d unity5


【解决方案1】:

SceneManager API 具有您可以订阅场景更改的事件。例如:

  using UnityEngine.SceneManagement;

  void OnEnable() 
  {
      SceneManager.sceneLoaded += OnSceneLoaded;
  }

  void OnDisable() 
  {
      SceneManager.sceneLoaded -= OnSceneLoaded;
  }

  private void OnSceneLoaded(Scene scene, LoadSceneMode mode) 
  {
      // all objects are loaded, call other methods
  }

【讨论】:

  • 像时钟一样工作!谢谢!现在我了解了 OnEnable 的工作原理,那么 OnDisable 呢?是用来卸载旧场景的吗?如果是,那么如何?
  • OnDisable 在游戏对象即将被销毁/设置为非活动状态时调用,可用于任何清理代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多