我有这样的代码,一旦球触发碰撞,该代码应该淡出旋转的黄色立方体。
但是,一旦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);
}
}
编辑:红色终点线使用相同的代码没有问题。
EDIT2:在第二张屏幕截图上,我设法找到了 a 的值,然后将其变为 -0.200 ,该值为 2.980232E-08 。我真的不知道这是什么意思。
答案 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);
}
}