Как исчезнуть в интерфейсе изображения в Unity - PullRequest
0 голосов
/ 09 июня 2019

Я хочу изменить изображение UI с прозрачного (альфа = 0) до альфа = 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());
    }
}

Изображение не меняется.Но я попробовал fadeout, используя этот код, от 1 до 0, он просто работал, я понятия не имею, почему не работает fadein?

1 Ответ

0 голосов
/ 09 июня 2019

image.material.color - это не то, что вы думаете

С помощью нескольких строк отладки я смог определить, что альфа-версия материала изображения сообщает, что он равен 1, даже когда я установил множитель цвета изображения на0.

Если я переопределю 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.
...