随着时间的推移,统一淡出图像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只是瞬间下降。

我做错了什么?

随着时间的推移,统一淡出图像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;
        }
    }
}