如何在Unity中淡化UI图像

时间:2019-06-09 16:19:47

标签: user-interface unity3d fade

我想将UI图像从透明(alpha = 0)渐变为alpha = 1,我认为我的方法应该是正确的,但是它不起作用,图像没有变化。

这是我尝试执行的代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Fadein : MonoBehaviour {


    public float FadeRate;
    private Image image;
    private float targetAlpha;

    // Use this for initialization
    void Start()
    {
        image = GetComponent<Image>();
        Material instantiatedMaterial = Instantiate<Material>(image.material);
        image.material = instantiatedMaterial;
        targetAlpha = image.material.color.a;

        Invoke("startFadein", 1);

    }

    IEnumerator FadeIn()
    {
        targetAlpha = 1.0f;
        Color curColor = image.material.color;
        while (Mathf.Abs(curColor.a - targetAlpha) > 0.0001f)
        {
            curColor.a = Mathf.Lerp(curColor.a, targetAlpha, FadeRate * Time.deltaTime);
            image.material.color = curColor;
            yield return null;
        }
    }

    void startFadein()
    {

        StartCoroutine(FadeIn());
    }
}

图像没有变化。但是我尝试使用此代码从1到0进行淡入淡出,它只是起作用了,我不知道为什么淡入淡出不起作用?

1 个答案:

答案 0 :(得分:0)

image.material.color不是您想的那样

使用几行调试行,即使将图像颜色倍数设置为0,我也可以确定图像材料的alpha报告1

如果我将curColor改写为0,然后让循环执行该操作,则图像也将不会出现。

这是因为:

image color

不是image.material.color。是image.color

因此您的固定代码为:

IEnumerator FadeIn() {
    targetAlpha = 1.0f;
    Color curColor = image.color;
    while(Mathf.Abs(curColor.a - targetAlpha) > 0.0001f) {
        Debug.Log(image.material.color.a);
        curColor.a = Mathf.Lerp(curColor.a, targetAlpha, FadeRate * Time.deltaTime);
        image.color = curColor;
        yield return null;
    }
}

其他一些事情:

  • 您的代码不会线性显示颜色。我确定您知道这一点,并且您可能对此表示满意,但我想我会指出这一点。
  • 您不需要Invoke("startFadein", 1);。您只需致电StartCoroutine(FadeIn());并将yield return new WaitForSeconds(1)放在顶部即可。
  • 您的图像将永远不会真正达到目标值,它将接近但不相等。您可以通过将curColor.a = targetAlpha; image.color = curColor;放在while循环之后来解决此问题。