Проблема с ключами Gradient
Делаю плавную смену цвета от белого к черному и наоборот. С доки переписал скрипт
[SerializeField] private Light _light;
[SerializeField] private Gradient _gradient;
private bool _isBlack = false;
private GradientColorKey[] _colorKeys;
private GradientAlphaKey[] _alphaKeys;
private void Start()
{
_colorKeys = new GradientColorKey[2];
_colorKeys[0].color = Color.white;
_colorKeys[0].time = 0.0f;
_colorKeys[1].color = Color.black;
_colorKeys[1].time = 1.0f;
_alphaKeys = new GradientAlphaKey[2];
_alphaKeys[0].alpha = 1.0f;
_alphaKeys[0].time = 0.0f;
_alphaKeys[1].alpha = 0.0f;
_alphaKeys[1].time = 1.0f;
_gradient.SetKeys(_colorKeys, _alphaKeys);
StartCoroutine("ChangeColor");
}
private IEnumerator ChangeToBlack()
{
_light.color = Color.Lerp(_gradient.colorKeys[0].color, _gradient.colorKeys[1].color, Time.deltaTime * 0.1f);
_isBlack = true;
yield return new WaitForSeconds(5f);
StartCoroutine("ChangeColor");
}
и при запуске сцены выбивается ошибка outside the bounds в месте обращения к ключам градиента > _gradient.colorKeys[0].color . Не понимаю в чем трабла.
Ответы (1 шт):
Автор решения: Yaroslav
→ Ссылка
1 Если в используете Color.Lerp(a, b, t), то зачем вам Gradient?
2 Ваша корутина меняет цвет один раз на одну десятые дельты и тупо ждёт 5 секунд ничего не делая.
Правильный вариант:
private void Start () {
StartCoroutine(TransitionGradient(1f, _gradient));
}
private IEnumerator TransitionGradient (float time, Gradient gradient) {
float Timer = 0;
while (Timer < time) {
_light.color = gradient.Evaluate(Timer/time);
yield return null;
Timer += Time.deltaTime;
}
_light.color = gradient.Evaluate(1);
}
Для простого перехода с цвета a на b и обратно:
private float _switchTime = 1f;
private Color _colorA = Color.white;
private Color _colorB = Color.black;
private bool _toggle;
private IEnumerator _switchCoroutine;
private void Start () {
SwitchColor();
}
private void SwitchColor () {
_toggle = !_toggle;
StopCoroutine(_switchCoroutine);
if (_toggle)
_switchCoroutine = TransitionColor(_switchTime, _colorA, _colorB);
else
_switchCoroutine = TransitionColor(_switchTime, _colorB, _colorA);
StartCoroutine(_switchCoroutine);
}
private IEnumerator TransitionColor (float time, Color colorA, Color colorB) {
float Timer = 0;
while (Timer < time) {
_light.color = Color.Lerp(colorA, colorB, Timer/time);
yield return null;
Timer += Time.deltaTime;
}
_light.color = colorB;
}