我有一个玩家的产卵障碍物,当游戏开始时,障碍物会出现在对方的身上,我试图通过while和物理二维循环来解决这个问题,但当我开始游戏时,Unity崩溃了。我试图通过while和物理二维循环来解决这个问题,但当我开始游戏时,Unity崩溃了.而且我还尝试通过Raycast2D来检查当光束与某种碰撞器碰撞时,改变其位置。但是Ray a small并不总是有效。
第一种方法
while (!Physics.CheckBox(pos, BlotPref[1].transform.localScale))
{
pos = new Vector2(Random.Range(-1f, 1f), YPosSetter());
}
第二种方式
while (hit.collider == null)
{
transform.position = new Vector2(Random.Range(-1f, 1f), YPosSetter());
}
产卵器
private void SpawnerPaper()
{
for (int i = 0; i < PlaningSpawn; i++)
{
if (rndType <= _dbPaperSpawn)
{
var blot = Instantiate(BlotPref[Random.Range(0, BlotPref.Length)], new Vector2(Random.Range(-1f, 1f), Random.Range(30f, 70f)), Quaternion.identity);
blot.transform.SetParent(paper.transform);
}
}
}
一个解决方案是测试对撞机,如果障碍物附近的随机位置与 Physics2D.OverlapCircleAll 并使用 层次:
当然,障碍物有碰撞器...
private void SpwanerPaper()
{
for (int i = 0; i < PlaningSpawn; i++)
{
if (rndType <= _dbPaperSpawn)
{
while (true)
{
var position = new Vector2(Random.Range(-1f, 1f), Random.Range(30f, 70f));
// i have choosen radius 1f, you could increase it if needed
Collider2D[] colliders = Physics2D.OverlapCircleAll(position, 1f, obstacleLayer);
if (colliders.Length == 0)
{
//so no obstacles present, spawn here
var blot = Instantiate(BlotPref[Random.Range(0, BlotPref.Length)],
position, Quaternion.identity);
blot.transform.SetParent(paper.transform);
break;// get out while loop
}
// so obstacles within 1m of the player loop again and give new random position
}
}
}
}
在这种情况下,你也可以使用 物理学2D.CircleCastAll
如果你不知道Layers,你有一个教程YouTube。这里