Временное событие в Unity

Рейтинг: 0Ответов: 2Опубликовано: 12.04.2023

Как сделать так, что бы при нажатии на текст, он менял свой цвет на время, например на 1 секунду, а потом возвращался к исходному цвету?

Ответы

▲ 3
using System.Collections;
using UnityEngine;
using UnityEngine.UI;

public class Sample : MonoBehaviour
{
    public Text text;
    public Color color1 = Color.white, color2 = Color.red;

    //Вызываем метод в onClick(Button) или через EventTrigger и ставим время
    public void SetColor(float time)
    {
        //цвет поменяется на красный
        text.color = color2;
        //Запуск итератора
        StartCoroutine(ReturnColor(time));
    }

    IEnumerator ReturnColor(float value)
    {
        //Сколько мы поставили значение в инспекторе столько и будет.
        yield return new WaitForSeconds(value);
        text.color = color1; //цвет снова будет белым.

    }
}
▲ 0

Для любых ограниченных по времени событий используется корутины. Пример использования корутин с запусками и прерываниями

using System.Collections;
using UnityEngine;
using UnityEngine.UI;

public class TemporaryColor : MonoBehaviour
{
    // все графические UI наследники Graphic. Image, RawImage, Text и даже TextMeshPro
    [SerializeField] private Graphic _target;
    [SerializeField] private Color _overrideColor = Color.white;
    [Space]
    [SerializeField] private float _temporaryDuration = 1;
    [SerializeField] private float _fadeDuration = 0.25f;
    private Color _originalColor;
    // ссылки на корутины, которыми будем пользоваться
    private IEnumerator _temporaryPerformance;
    private IEnumerator _fadePerformance;

    public void Execute ()
    {
        // если процесс уже исполняется, останавливаем все
        if (_temporaryPerformance != null || _fadePerformance != null)
        {
            StopAllCoroutines();
            _temporaryPerformance = null;
            _fadePerformance = null;
        }
        // если нет сохраняем оригинальный цвет
        else
        {
            _originalColor = _target.color;
        }

        // запускаем корутину
        _temporaryPerformance = TemporaryPerformance();
        StartCoroutine(_temporaryPerformance);
    }

    private IEnumerator TemporaryPerformance ()
    {
        Fade(_overrideColor);
        // джет указанное время
        yield return new WaitForSeconds(_temporaryDuration);
        Fade(_originalColor);
        // присваиваем null, что бы знать что процесс был закончен
        _temporaryPerformance = null;
    }

    private void Fade (Color to)
    {
        // если корутина перелива в процессе, останавливаем конкретно её
        if (_fadePerformance != null)
            StopCoroutine(_fadePerformance);
        _fadePerformance = FadePerformance(to);
        StartCoroutine(_fadePerformance);
    }

    private IEnumerator FadePerformance (Color to)
    {
        Color from = _target.color;
        float elapsed = 0;
        while (elapsed < _fadeDuration)
        {
            // ждет следующего кадра, как в Update
            yield return null;
            elapsed += Time.deltaTime;
            float progress = elapsed / _fadeDuration;
            _target.color = Color.Lerp(from, to, progress);
        }
        _target.color = to;
        _fadePerformance = null;
    }
}