Unity坐标为设定为(1,1,1),后来莫名变成了(0.9999,0.9999,0.9999)
为了解决这个问题,我们从transform.poistion入手,寻其根源发现poisition的类型是Vector3类型,这是一个结构体类型,反编译一下,然后我发现里面出现了一个常数kEpsilon=0.00001f;记住这个常数
public const float kEpsilon = 1E-05F;
public float x;
public float y;
public float z;
在==
运算符重载时用到了这个函数,下面是源码
public static bool operator==(Vector3 lhs, Vector3 rhs)
{
// Returns false in the presence of NaN values.
return SqrMagnitude(lhs - rhs) < kEpsilon * kEpsilon;
}
public static float SqrMagnitude(Vector3 vector)
{
return vector.x * vector.x + vector.y * vector.y + vector.z * vector.z;
}
也就是说,当你使用两个很小的值比较大小时,是有被认为相等的可能的
下面是示例:
Vector3 v1 = new Vector3(0.00001f,0.00001f,0.00001f);
Vector3 v2 = new Vector3(0.000009f,0.000009f,0.000009f);
private void Start()
{
if (v1 == v2)
{
Debug.Log("相等");
}
}
所以当编辑器经过某些运算之后,因为存在人为定义的原因,可以把1-0.00001的值近似的看作1,所以会出现这种情况。