我在几个月前制作的练习游戏中成功使用了推子。我现在正在尝试为我的手机游戏实施类似的方法。
我的目标:当用户进入播放屏幕时,屏幕淡出,异步加载场景,并在该方法完成后淡入。
我的代码
这些是我的变量:
CanvasGroup canvasGroup;
Coroutine currentActiveFade = null;
int sceneIndexToLoad = -1;
float fadeInTime = 2f;
float fadeOutTime = 1f;
float fadeWaitTime = 0.5f;
这些是我的次要方法:
public void FadeOutImmediately()
{
canvasGroup.alpha = 1;
}
public Coroutine FadeOut(float time)
{
return Fade(1, time);
}
public Coroutine Fade(float target, float time)
{
if (currentActiveFade != null)
{
StopCoroutine(currentActiveFade);
}
currentActiveFade = StartCoroutine(FadeRoutine(target, time));
return currentActiveFade;
}
private IEnumerator FadeRoutine(float target, float time)
{
while (!Mathf.Approximately(canvasGroup.alpha, target))
{
canvasGroup.alpha = Mathf.MoveTowards(canvasGroup.alpha, target, Time.deltaTime / time);
yield return null;
}
}
public Coroutine FadeIn(float time)
{
return Fade(0, time);
}
这是我的主要功能,我得到了我的错误:
public IEnumerator TransitionToNewScene()
{
if(sceneIndexToLoad < 0)
{
Debug.LogError("Scene to load is not set");
yield break;
}
DontDestroyOnLoad(gameObject);
//GETS STUCK ON THIS LINE
yield return FadeOut(fadeOutTime);
yield return SceneManager.LoadSceneAsync(sceneIndexToLoad); //this still executes
yield return new WaitForSeconds(fadeWaitTime);
FadeIn(fadeInTime);
Destroy(gameObject);
}
我的代码到达并启动 FadeOut 协程,并加载下一个场景。当我在我的 FadeOut 调用下放置一个调试语句时,它没有达到它,但似乎达到了下一个产量回报。
我的问题: canvasGroup alpha 在下一个场景中达到 1,但这就是它停止的地方。没有达到 FadeIn 代码,并且我的游戏对象没有被破坏。为什么会这样?
请注意:这段代码几乎和我之前的项目一模一样,效果很好。