You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity场景加载切换淡入淡出失效问题及最佳实现方式问询

场景切换淡入淡出效果失效的解决方法

问题根源

你当前的代码逻辑存在两个核心问题:

  1. 脚本和遮罩Image挂载在原场景对象上,调用SceneManager.LoadScene(1, LoadSceneMode.Single)后,原场景所有对象会被立即销毁,导致淡黑的协程还没执行完就终止,自然看不到效果。
  2. 流程顺序错误:没有等待淡黑完成就直接加载场景,也未在场景加载完成后执行淡白逻辑。

修复方案

  1. 将挂载脚本的对象设置为跨场景不销毁:在脚本的Awake方法中调用DontDestroyOnLoad(gameObject),确保遮罩和脚本在场景切换时不会被销毁。
  2. 调整协程执行顺序:先完成淡黑到全黑,再异步加载新场景,最后在场景加载完成后执行淡白到透明。
  3. 使用LoadSceneAsync异步加载场景,以便等待加载完成后再执行后续逻辑。

修改后的完整代码

using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
using System.Collections;

public class Scenes_Test : MonoBehaviour
{
    public float fadeDuration = 1f;
    public Image fadeImage;

    private void Awake()
    {
        // 确保该对象在场景切换时不被销毁
        DontDestroyOnLoad(gameObject);
        // 初始化遮罩为全透明
        fadeImage.color = new Color(fadeImage.color.r, fadeImage.color.g, fadeImage.color.b, 0);
    }

    private void Start()
    {
        // 启动完整的场景切换淡入淡出流程
        StartCoroutine(SceneTransitionCoroutine(1));
    }

    /// <summary>
    /// 完整的场景切换协程:淡黑 → 加载场景 → 淡白
    /// </summary>
    /// <param name="sceneIndex">要加载的场景索引</param>
    private IEnumerator SceneTransitionCoroutine(int sceneIndex)
    {
        // 第一步:淡至全黑
        yield return StartCoroutine(ImageFade(fadeImage, 1f, fadeDuration));

        // 第二步:异步加载目标场景,等待加载完成
        AsyncOperation asyncLoad = SceneManager.LoadSceneAsync(sceneIndex, LoadSceneMode.Single);
        // 等待场景加载完成
        while (!asyncLoad.isDone)
        {
            yield return null;
        }

        // 第三步:淡回透明
        yield return StartCoroutine(ImageFade(fadeImage, 0f, fadeDuration));
    }

    /// <summary>
    /// 图片透明度渐变协程
    /// </summary>
    private IEnumerator ImageFade(Image targetImage, float targetAlpha, float duration)
    {
        float elapsedTime = 0f;
        float startAlpha = targetImage.color.a;

        while (elapsedTime < duration)
        {
            elapsedTime += Time.deltaTime;
            float currentAlpha = Mathf.Lerp(startAlpha, targetAlpha, elapsedTime / duration);
            targetImage.color = new Color(targetImage.color.r, targetImage.color.g, targetImage.color.b, currentAlpha);
            yield return null;
        }

        // 确保最终透明度准确设置为目标值
        targetImage.color = new Color(targetImage.color.r, targetImage.color.g, targetImage.color.b, targetAlpha);
    }
}

额外注意事项

  • 确保遮罩Image是全屏覆盖的,且在UI层级的最顶层,避免被其他UI遮挡。
  • 在Build Settings中确认目标场景的索引正确(你这里设置为1,需与配置一致)。
  • 编辑器中场景加载速度快属于正常情况,但修改后的逻辑会保证淡入淡出流程完整执行。

效果截图

效果截图

内容的提问来源于stack exchange,提问作者Daniel Lip

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 14:50:13