不尊重if陈述

时间:2019-01-23 18:49:49

标签: if-statement unity3d runtime-error

我有这样的代码,一旦球触发碰撞,该代码应该淡出旋转的黄色立方体。
但是,一旦alpha达到 0 ,它将继续运行一遍,直到alpha达到 -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 :(得分:2)

发生这种情况的原因是single floating point precision

=>切勿直接比较两个float值。


您应该使用例如Mathf.Approximately

if(Mathf.Approximately(rndr.material.color.a, 0))

答案 1 :(得分:1)

这可能是因为当它接近0f时alpha的值可能不完全为0(即0.0000001> 0.0f),我将您的布尔值设为if (rndr.material.color.a > 0.2f)或在下面将alpha值设置为0其他

答案 2 :(得分:0)

值2.980232E-08低于Machine epsilon,请参见https://en.wikipedia.org/wiki/Machine_epsilon以获取浮点数。

当从1.0f连续减去0.2f(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);
    }

}