【问题标题】:Coroutine not starting when loading from a different scene从不同场景加载时协程未启动
【发布时间】:2019-06-11 14:40:57
【问题描述】:

我有一个字符选择屏幕,显示确认屏幕并在选择时,开始了Coroutine,将粒子突发到屏幕中,加载新的级别 - 这是延迟粒子的负载可以填满屏幕。

当我通过在 Unity 编辑器上直接加载场景(角色选择)来测试它时,这一切都按预期工作,但是,如果我正在做一个完整的测试并且我来自(开始屏幕)我可以做任何事情并且debug 说它正在注册所有内容,但是粒子不显示并且加载不执行。

此外,控制台不会显示任何错误。

我已经尝试了所有方法(停止协程,使用 while(true) ...),但不知道为什么它不加载。代码如下:

UI 按钮具有LoadEloise() 作为单击它时触发的方法。

代码如下:

尝试在激活协程之前和开始时停止协程,同时确保粒子系统在再次激活之前设置为 Active(false)。

IEnumerator DelayLoad() 
{
     heartExplosion[explosionNumber].gameObject.SetActive(true);
     yield return new WaitForSeconds(1);
     SceneManager.LoadScene(sceneName);
}

public void LoadEloise() 
{
     sceneName = "Eloise"; 
     explosionNumber = 10; 

     StartCoroutine(DelayLoad());
}

预期结果:粒子系统被激活,覆盖屏幕,然后在一秒钟后加载新场景。

这是一个显示预期结果的视频,通过从托管协程的场景开始测试来实现:https://www.youtube.com/watch?v=BQAgzJ-HJB4&feature=youtu.be

实际结果:什么都没有,没有错误,没有粒子,什么都没有。从图形的角度来看,该按钮显示为按下,但没有任何反应。

这是一段视频,展示了从上一场景启动代码时会发生什么:https://www.youtube.com/watch?v=WhEzi9Qjvg8&feature=youtu.be

【问题讨论】:

  • 添加一些调试语句检查所有的值和发生了什么
  • 欢迎来到 StackOverflow!您是否尝试设置断点以查看调用了哪一行?还有by directly loading the scene是什么意思?从您的代码中看不到为什么这不起作用...
  • 持有脚本的对象是否处于活动状态?
  • 谢谢大家,我确实将 Debug.Log 添加到控制台以查看正在调用哪些行。它似乎在激活粒子效果后立即停止,但从未显示。这意味着它进入了协程,但它永远不会到达 Load level 部分。
  • @Everts 对象开始处于非活动状态,但是当通过代码所在的场景到达它时,它会毫无问题地激活它。

标签: c# unity3d


【解决方案1】:

您的 LoadEloise 函数是否被调用?

如果只是粒子没有显示的问题,那么可能是没有为粒子系统/容器正确设置画布排序顺序之类的情况,但是如果后续的场景加载也没有发生,那么你需要先检查两件事:

  1. 添加断点/调试语句以遵循代码的执行顺序,并确保按照应有的顺序调用正确的函数。
  2. 如果调用了所有函数并且您没有看到与场景加载相关的任何错误,则可能与在外部加载场景时如何设置场景有关。在新场景的初始化函数中添加断点/调试调用以确保它已加载并就位,确保在加载场景时内容的位置/比例没有设置为一些奇怪的值并检查层次结构在编辑器窗口中定位场景内容,确保视觉元素设置正确。

【讨论】:

  • 嗨,所以我添加了断点,似乎没有任何问题。我还检查了从前一个场景加载的场景,它包含所有内容。如果我更改代码,以便在单击按钮时将您带到下一个场景,它可以正常工作,但是如果我尝试延迟它只是为了显示粒子效果,无论是使用协程还是调用,它都会停止工作但不会显示错误.
  • 设法修复它!问题在于来自我添加到主项目的库中的一行代码,并且我忘记了我在一开始就使用了一个按钮,这改变了时间设置 - 因此我假设任何尝试获取协程正常工作。谢谢大家的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-19
  • 1970-01-01
相关资源
最近更新 更多