2015-03-31 46 views
0

我是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的上方,但它们之间的距离意外增加。

+0

我不认为浮点比较是你的问题,它似乎是一个逻辑错误。你能简化你的场景结构来隔离问题吗? – yoyo 2015-04-01 03:56:11

+0

我通过添加屏幕截图来编辑帖子。 – 2015-04-01 18:49:24

回答

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。

0

尝试这种解决方案:

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

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

+0

OP表示他们已经尝试了Mathf.Approximately方法。此外,他正在比较不是平等测试,所以我不认为这是问题。 – yoyo 2015-04-01 03:55:37