随机实例化预制件,但不在已生成的位置

时间:2014-08-06 07:38:05

标签: unity3d unityscript

我想在我的屏幕中随机生成气泡。当在一个地方产生气泡时,在其半径1区域附近不会产生其他气泡。意味着气泡不会与任何其他气泡碰撞或触发。

我该怎么做?

public void GenerateBubble ()
        {
                newBubbleXPos = Random.Range (-7, 7);
                newBubbleYPos = Random.Range (-3, 3);
                bubbleClone = (GameObject)Instantiate (bubblePrefab, new Vector3 (newBubbleXPos, newBubbleYPos, 0), Quaternion.identity);
                UIManager.instance.ChangeBubbleSprite (bubbleClone);
                bubbleList.Add (bubbleClone);
                if (bubblePosList.Contains (bubbleClone.transform.position)) {
                    bubbleClone.transform.position=new Vector3(Random.Range (-7,7),Random.Range (-3,3),0);
                }
                bubblePosList.Add (bubbleClone.transform.position);
                bubbleClone.transform.parent = UIManager.instance.CurrentLevel.transform;
                GLOBALS.bubbleCounter++;
        }

在我的代码中,每个气泡都生成在不同的位置,但是它可以与其他气泡碰撞意味着我想要产生新的气泡而不是相同的位置以及它也不会碰撞。 我的泡泡对手的半径是1。

2 个答案:

答案 0 :(得分:4)

我找到了答案:

    public List<GameObject> bubbleList = new List<GameObject> ();
    private int newBubbleXPos;
    private int newBubbleYPos;

public void GenerateBubble ()
    {
        bool locationInvaild = true;
        while (locationInvaild) {
            newBubbleXPos = Random.Range (-8, 8);
            newBubbleYPos = Random.Range (-4, 4);
            currentPosition = new Vector3 (newBubbleXPos, newBubbleYPos, 0);
            locationInvaild = false;
            for (int i=0; i<bubbleList.Count; i++) {
                if (Vector3.Distance (bubbleList [i].transform.position, currentPosition) < 2.5f * radius) {
                    locationInvaild = true;
                    break;
                }
            }
        }
        bubbleClone = Instantiate (bubblePrefab, new Vector3 (newBubbleXPos, newBubbleYPos, 0), Quaternion.identity) as GameObject;
        bubbleList.Add (bubbleClone);
    }

答案 1 :(得分:3)

这类似于a packing problem。计算气泡不会与任何其他气泡或边界碰撞的位置可能会有点困难(特别是如果有很多气泡和很小的空间)。

因此,我建议首先寻找更简单的方法,例如

  • 将区域划分为一个网格,其中一个单元格比气泡略大。然后首先随机选择一个单元格,然后在该位置添加一点随机变量。如果您随机选择已使用的单元格,只需选择下一个可用单元格。
  • 利用物理学:当您创建一个新的气泡时,将其设置为低质量(例如1),并在短时间内将其质量变大(例如1000)。还要冻结它们的旋转并添加对撞机组件。通过这种方式,新泡沫必须“找到”#34;新的空间,因为两个物理对象不能重叠,质量较小的物体会移动。
  • 如果只有少量气泡,您可以随意创建一个新位置,直到它不会与任何其他气泡发生碰撞。

这些位置也可能是预先计算好的,因此无需进行运行。