From 56045b4bcd00714f13f2bec6b5470ecf25aa77d3 Mon Sep 17 00:00:00 2001 From: Ding Yuntian <1491671119@qq.com> Date: Thu, 16 Jul 2026 17:56:59 +0800 Subject: [PATCH] =?UTF-8?q?fix(fade-kit):=20=E4=BF=AE=E5=A4=8D=20FadeKit?= =?UTF-8?q?=20=E7=A9=BA=E5=BC=95=E7=94=A8=E5=92=8C=E9=9B=B6=E6=97=B6?= =?UTF-8?q?=E9=95=BF=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 增加 Image 空引用保护 - 处理 duration 小于等于 0 的边界情况 - 动画开始前调用 DOKill 避免冲突 - 使用 DOFade 替代 DOBlendableColor,行为更明确 --- Assets/Scripts/Framework/OtherKit/FadeKit.cs | 68 ++++++++++++++------ 1 file changed, 50 insertions(+), 18 deletions(-) diff --git a/Assets/Scripts/Framework/OtherKit/FadeKit.cs b/Assets/Scripts/Framework/OtherKit/FadeKit.cs index 7de1574e4..5449fb880 100644 --- a/Assets/Scripts/Framework/OtherKit/FadeKit.cs +++ b/Assets/Scripts/Framework/OtherKit/FadeKit.cs @@ -9,42 +9,74 @@ namespace AibisDream.Framework { public static IEnumerator FadeInAsync(this Image image, float duration, bool useUnscaledTime = false) { - image.gameObject.SetActive(true); - var tweener = image.DOBlendableColor(Color.white, duration); - if (useUnscaledTime) + var tweener = StartFade(image, 1f, duration, useUnscaledTime); + if (tweener != null) { - tweener.SetUpdate(true); + yield return tweener.WaitForCompletion(); } - - yield return tweener.WaitForCompletion(); } public static void FadeIn(this Image image, float duration) { - image.gameObject.SetActive(true); - var tweener = image.DOBlendableColor(Color.white, duration); + StartFade(image, 1f, duration, false); } public static IEnumerator FadeOutAsync(this Image image, float duration, bool useUnscaledTime = false) { - image.gameObject.SetActive(true); - var tweener = image.DOBlendableColor(Color.clear, duration); - if (useUnscaledTime) + var completed = false; + var tweener = StartFade(image, 0f, duration, useUnscaledTime); + if (tweener == null) { - tweener.SetUpdate(true); + image?.gameObject.SetActive(false); + yield break; } + tweener.OnComplete(() => completed = true); yield return tweener.WaitForCompletion(); - image.gameObject.SetActive(false); + if (completed && image != null) + { + image.gameObject.SetActive(false); + } } public static void FadeOut(this Image image, float duration) { - image.gameObject.SetActive(true); - image.DOBlendableColor(Color.clear, duration).onComplete += () => + var tweener = StartFade(image, 0f, duration, false); + if (tweener == null) { - image.gameObject.SetActive(false); - }; + image?.gameObject.SetActive(false); + return; + } + + tweener.OnComplete(() => + { + if (image != null) + { + image.gameObject.SetActive(false); + } + }); + } + + private static Tweener StartFade(Image image, float targetAlpha, float duration, bool useUnscaledTime) + { + if (image == null) + { + return null; + } + + image.DOKill(false); + image.gameObject.SetActive(true); + + duration = Mathf.Max(0f, duration); + if (duration <= 0f) + { + var color = image.color; + color.a = targetAlpha; + image.color = color; + return null; + } + + return image.DOFade(targetAlpha, duration).SetUpdate(useUnscaledTime); } } -} \ No newline at end of file +}