Unity场景加载切换淡入淡出失效问题及最佳实现方式问询
场景切换淡入淡出效果失效的解决方法
问题根源
你当前的代码逻辑存在两个核心问题:
- 脚本和遮罩Image挂载在原场景对象上,调用
SceneManager.LoadScene(1, LoadSceneMode.Single)后,原场景所有对象会被立即销毁,导致淡黑的协程还没执行完就终止,自然看不到效果。 - 流程顺序错误:没有等待淡黑完成就直接加载场景,也未在场景加载完成后执行淡白逻辑。
修复方案
- 将挂载脚本的对象设置为跨场景不销毁:在脚本的
Awake方法中调用DontDestroyOnLoad(gameObject),确保遮罩和脚本在场景切换时不会被销毁。 - 调整协程执行顺序:先完成淡黑到全黑,再异步加载新场景,最后在场景加载完成后执行淡白到透明。
- 使用
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
相关产品推荐
相关产品推荐

