Не уважая если заявление - PullRequest
0 голосов
/ 23 января 2019

У меня есть этот код, который должен затухать во вращающемся желтом кубе, как только мяч вызовет столкновение.
Но как только альфа достигает 0 , она продолжается еще раз, пока альфа не достигнет -0.200 и куб не станет синим перед исчезновением.

if (disapear)
{
    if (rndr.material.color.a > 0.0f)
    {
        rndr.material.color -= new Color(0, 0, 0, 0.2f);
        Debug.Log(rndr.material.color);
    }
    else
    {
        gameObject.SetActive(false);
    }
}

finish line

Screenshot 2

РЕДАКТИРОВАТЬ: Нет проблем с красной финишной чертой, которая использует тот же код.

EDIT2: На втором снимке экрана мне удалось найти значение a , прежде чем оно станет -0.200 , которое равно 2.980232E-08 . Я действительно не знаю, что это значит.

Ответы [ 3 ]

0 голосов
/ 23 января 2019

Значение 2.980232E-08 ниже, чем у Эпсилон машины, см. https://en.wikipedia.org/wiki/Machine_epsilon для поплавка.

Скорее всего, это происходит при последовательном вычитании 0.2f из 1.0f (5 раз). Скорее всего, 1.0f -5.0f * 0.2f ~ 2.980232E-08f

Поэтому вам следует изменить способ реализации функции, возможно, добавьте increment_to_disappear (int) вместе со свойством disapear:

if (disapear)
{
    if (increment_to_disappear < 5)
    {
        rndr.material.color -= new Color(0, 0, 0, 0.2f);
        increment_to_disappear++;
    }
    else
    {
        gameObject.SetActive(false);
    }

}
0 голосов
/ 23 января 2019

Это происходит из-за единственной точности с плавающей запятой .

=> Никогда не сравнивайте два float значения напрямую.


Вы должны использовать, например, Mathf. Приблизительно

if(Mathf.Approximately(rndr.material.color.a, 0))
0 голосов
/ 23 января 2019

Вероятно, это связано с тем, что значение альфа, когда оно приближается к 0f, может не совпадать с 0 (т. Е. 0,0000001> 0,0f), я бы сделал ваш логический параметр равным if (rndr.material.color.a > 0.2f) или установил бы значение альфа на 0 в противном случае

...