我想在我的屏幕中随机生成气泡。当在一个地方产生气泡时,在其半径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。
答案 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。计算气泡不会与任何其他气泡或边界碰撞的位置可能会有点困难(特别是如果有很多气泡和很小的空间)。
因此,我建议首先寻找更简单的方法,例如
这些位置也可能是预先计算好的,因此无需进行运行。