为什么比较浮动值是如此困难?

时间:2015-03-31 21:03:34

标签: unity3d compare

我是Unity平台的新手。我有2D游戏,包含10个盒子垂直相互跟随链。当一个盒子离开屏幕时,我将其位置改为顶部盒子的上方。所以链条无限转动,就像重复视差滚动背景一样。

但是我通过将其位置与指定的浮点值进行比较来检查一个框是否离开屏幕。我在下面分享我的代码。

void Update () {
    offSet = currentSquareLine.transform.position;
    currentSquareLine.transform.position = new Vector2 (0f, -2f) + offSet;

    Vector2 vectorOne = currentSquareLine.transform.position;
    Vector2 vectorTwo = new Vector2 (0f, -54f);

    if(vectorOne.y < vectorTwo.y) {
        string name = currentSquareLine.name;
        int squareLineNumber = int.Parse(name.Substring (11)) ;
        if(squareLineNumber < 10) {
            squareLineNumber++;
        } else {
            squareLineNumber = 1;
        }
        GameObject squareLineAbove = GameObject.Find ("Square_Line" + squareLineNumber);

        offSet = (Vector2) squareLineAbove.transform.position + new Vector2(0f, 1.1f);
        currentSquareLine.transform.position = offSet;
    }
}

正如你所看到的,当我比较vectorOne.y和vectorTwo.y时,事情变得很丑陋。有些盒子会拉长,有些盒子会缩短彼此之间的距离,即使我在上面的代码中给出了精确的向量值。

我已经搜索了一周的解决方案,并尝试了许多代码,如Mathf.Approximate,Mathf.Round,但没有一个能够正确地比较浮点值。如果团结永远不会以我期望的方式比较浮动值,我想我需要改变我的方式。

我在等待你的神圣建议,谢谢!

修改

这是我的屏幕。我有10条箱线垂直向下。

Screen Structure

当Square_Line10离开屏幕时。我将其位置更新为Square_Line1以上,但它们之间的距离意外增加。

2 个答案:

答案 0 :(得分:1)

好的,我找到了一个像魅力一样的解决方案。

我需要使用一个数组并在两个for循环中检查它们。第一个移动方框,第二个方框检查是否有一个方框离开屏幕,如下所示

public GameObject[] box;
float boundary = -5.5f;
float boxDistance = 1.1f;
float speed = -0.1f;

// Update is called once per frame
void Update () {
    for (int i = 0; i < box.Length; i++) {
        box[i].transform.position = box[i].transform.position + new Vector3(0, speed, 0);
    }

    for (int i = 0; i < box.Length; i++)
    {
        if(box[i].transform.position.y < boundary)
        {
            int topIndex = (i+1) % box.Length;

            box[i].transform.position = new Vector3(box[i].transform.position.x, box[topIndex].transform.position.y + boxDistance, box[i].transform.position.z);
            break;
        }
    }
}

我把它附在MainCamera上。

答案 1 :(得分:0)

试试这个解决方案:

bool IsApproximately(float a, float b, float tolerance = 0.01f) {
    return Mathf.Abs(a - b) < tolerance;
}

原因是内部比较的公差并不好用。如果需要更高的精度,请将函数调用中的公差值更改为更低。