0

我在几个月前制作的练习游戏中成功使用了推子。我现在正在尝试为我的手机游戏实施类似的方法。

我的目标:当用户进入播放屏幕时,屏幕淡出,异步加载场景,并在该方法完成后淡入。

我的代码

这些是我的变量:

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 代码,并且我的游戏对象没有被破坏。为什么会这样?

请注意:这段代码几乎和我之前的项目一模一样,效果很好。

4

1 回答 1

1

在淡入淡出完成之前不要这样做Destroy(gameObject);,当游戏对象被销毁时,所有协程都将停止。

我可能会把它放在 FadeRoutine 的末尾:

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;
    }

    if(target == 0)
        Destroy(gameObject);
}
于 2022-01-12T12:29:44.467 回答