Это потому, что цикл while
в этом методе никогда не завершается и, следовательно, Update
, который его вызывает, никогда не завершается. Это замораживает вашу игру.
Одним из возможных решений является превращение этого метода в сопрограмму (первый пример документации удивительно похож на ваш код!) И добавление return yield null
в конце цикла while:
IEnumerator degradeGradually(Renderer ren){
float time = Time.time;
Color32 col;
while(((Color32)ren.material.color).r > 89f){
if (Time.time - time > .025f) {
time = Time.time;
col = new Color32 ((byte)(((Color32)ren.material.color).r - 1f), (byte)(((Color32)ren.material.color).g - 1f), (byte)(((Color32)ren.material.color).b - 1f), 255);
ren.material.color = col;
}
yield return null;
}
}
А потом, где вы это называете,
// Instead of degradeGradually(r);
StartCoroutine(degradeGradually(r));
И если вам нужно что-то сделать непосредственно после того, как происходит деградация, вы можете добавить это в конец degradeGradually
.
...
ren.material.color = col;
}
yield return null;
}
DoStuffAfterDegrade();
}
Кроме того, значения цветовых компонентов варьируются от 0f
до 1f
, поэтому вы захотите уменьшить их на величину, меньшую 1f каждый раз. Как уже было написано, вы будете переходить в черный цвет на первом кадре, который вы получите внутри оператора if
. Вам также может потребоваться зажать компоненты между 0f
- 1f
, если Unity не даст вам никаких проблем с вводом отрицательных чисел.