随着时间的推移,统一淡出图像alpha
本文关键字:淡出 图像 alpha 时间 | 更新日期: 2023-09-27 18:11:20
我想改变我的UI图像的alpha逐渐而不是立即。到目前为止,我的代码褪色的alpha图像立即如下所示
public void Highlight()
{
foreach (Image image in imagesToHighlight)
{
Color c = image.color;
if(c.a < maxColor)
{
c.a = maxColor;
}
image.color = c;
}
foreach (Image image in imagesToFade)
{
Color c = image.color;
if(c.a > halfColor)
{
c.a = halfColor;
}
image.color = c;
}
}
上面的代码工作得很好,但我正在努力修改我的代码,以便它在一两秒钟内缓慢地完成,而不是立即完成。我试过将c.a = maxColor;
改为c.a--
,以查看图像是否会持续缓慢褪色,但alpha只是瞬间下降。
我做错了什么?
使用Coroutine
实现。像这样:
渐隐:
private YieldInstruction fadeInstruction = new YieldInstruction();
IEnumerator FadeOut(Image image)
{
float elapsedTime = 0.0f;
Color c = image.color;
while (elapsedTime < fadeTime)
{
yield return fadeInstruction;
elapsedTime += Time.deltaTime ;
c.a = 1.0f - Mathf.Clamp01(elapsedTime / fadeTime);
image.color = c;
}
}
你可以这样使用:
foreach (Image image in imagesToFade)
StartCoroutine(FadeOut(image));
渐明:
IEnumerator FadeIn(Image image)
{
float elapsedTime = 0.0f;
Color c = image.color;
while (elapsedTime < fadeTime)
{
yield return fadeInstruction;
elapsedTime += Time.deltaTime ;
c.a = Mathf.Clamp01(elapsedTime / fadeTime);
image.color = c;
}
}
希望能有所帮助
你也可以使用像Dotween这样的补间引擎,然后像这样简单地使用它:
image.DOFade(1, 0.5f)
Dotween有很多扩展方法可以帮助您,请参阅文档。http://dotween.demigiant.com/documentation.php
DOColor(Color to, float duration)
DOFade(float to, float duration)
所有的功劳都归于Umair M.我所做的只是使使用一种方法而不是两种方法成为可能。也不需要实例化方法。
我已经展示了整个类来指示如何运行方法,而不会在协例程完成之前出现相应的命令。
using System.Collections;
using UnityEngine;
using UnityEngine.UI;
public class FishUI : MonoBehaviour
{
public GameObject mainPanel;
public float fadeDelay = 1f;
public void OpenPanel()
{
mainPanel.SetActive(true);
StartCoroutine(Fade(mainPanel.GetComponent<Image>(), fadeDelay, true));
}
public void ClosePanel()
{
StartCoroutine(Fade(mainPanel.GetComponent<Image>(), fadeDelay, false));
Invoke(nameof(DelayedSetActive), fadeDelay);
}
void DelayedSetActive()
{
mainPanel.SetActive(false);
}
IEnumerator Fade(Image image, float fadeTime, bool fadeIn)
{
float elapsedTime = 0.0f;
Color c = image.color;
while (elapsedTime < fadeTime)
{
yield return null;
elapsedTime += Time.deltaTime;
if (fadeIn)
{
c.a = Mathf.Clamp01(elapsedTime / fadeTime);
}
else
{
c.a = 1f - Mathf.Clamp01(elapsedTime / fadeTime);
}
image.color = c;
}
}
}