Ваш цикл while
блокирует поток Main / UI => он выполняется, а следующий кадр отображается только после его завершения!
Дополнительно Time.deltaTime
- это время, которое прошлотак как последний кадр был обработан ... так что он может никогда достичь 0.2
, так как при условии, что вы работаете на 60 fps
, его значение будет около 0.017
=> Unity замораживается!
Вы должны использовать Coroutine вместо:
public class StarCollision : MonoBehaviour
{
private void OnTriggerEnter2D(Collider2D other)
{
if (other.gameObject.tag == "White Ball" )
{
ScoreScript.scoreValue += 1;
// start the routine
StartCoroutine(ChangeColor());
gameObject.SetActive(false);
}
}
private IEnumerator ChangeColor()
{
ScoreScript.score.color = Color.yellow;
// yield says: return to main thread, renderer the frame
// and continue from here in the next frame
// WaitForseconds .. does exactly this
yield return new WaitForseconds(0.2f);
ScoreScript.score.color = Color.white;
}
}
Я бы оставил ваш gameObject.SetActive(false);
до того, как Coroutine закончил, но после он начался, так как вы этого хотитенемедленно и
Примечание: Сопрограммы не останавливаются, когда MonoBehaviour
отключен, а только когда он определенно уничтожен.Вы можете остановить сопрограмму, используя MonoBehaviour.StopCoroutine
и MonoBehaviour.StopAllCoroutines
.Сопрограммы также останавливаются при уничтожении MonoBehaviour
.