Временное событие в Unity
Как сделать так, что бы при нажатии на текст, он менял свой цвет на время, например на 1 секунду, а потом возвращался к исходному цвету?
Источник: Stack Overflow на русском
Как сделать так, что бы при нажатии на текст, он менял свой цвет на время, например на 1 секунду, а потом возвращался к исходному цвету?
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; //цвет снова будет белым.
}
}
Для любых ограниченных по времени событий используется корутины. Пример использования корутин с запусками и прерываниями
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;
}
}