【发布时间】:2019-09-30 21:24:04
【问题描述】:
我有一个敌人的预制件,它会在玩家周围的随机位置多次生成。但是,有时这会使一个敌人预制件与另一个敌人预制件重叠。
所以,我编写了一个脚本,它使用Physics2D.OverlapCircleAll() 在实例化敌人预制件之前检测任何对撞机,从而避免敌人预制件与现有敌人重叠。我的问题是OverlapCircleAll() 没有检测到预制件的其他实例。
我也已经尝试过Physics2D.OverlapBoxAll。如果我生成的这些“敌人预制件”超过30,至少有一个会与另一个敌人重叠
这是用于检测重叠的代码:
public void SpawnEachEnemy(GameObject Enemy)
{
Vector3 futurePosition = new Vector2(UnityEngine.Random.Range(UpperLeft.transform.position.x, DownRight.transform.position.x),
UnityEngine.Random.Range(UpperLeft.transform.position.y, DownRight.transform.position.y));
bool correctPosition = false;
while (!correctPosition)
{
Collider2D[] collider2Ds = Physics2D.OverlapCircleAll(futurePosition,0.2f);
if (collider2Ds.Length > 0)
{
//re-spawning to prevent overlap
futurePosition = new Vector2(UnityEngine.Random.Range(UpperLeft.transform.position.x, DownRight.transform.position.x),
UnityEngine.Random.Range(UpperLeft.transform.position.y, DownRight.transform.position.y));
}
else
{
correctPosition = true;
}
}
GameObject b = Instantiate(Enemy) as GameObject;
b.transform.position = futurePosition;
b.transform.parent = this.transform;
}
【问题讨论】:
-
请编辑您的问题以包含minimal reproducible example。
OverlapCircleAll可能返回意外值的原因有很多,但问题中没有足够的信息来确定这里发生了什么。投票结束,直到添加 minimal reproducible example。 -
Physics2D.OverlapCircleAll(...) 函数是否会返回任何内容?你确定每个敌人都有一个对撞机吗?还可以考虑调整 Physics2D.OverlapCircleAll(..., r) 的半径以查看它是否检测到任何敌人。您提供的代码似乎正确。
-
@Ruzihm 这个代码已经是一个可重现的例子,你只需要从循环中调用这个函数并传递一个有碰撞器的游戏对象。
-
@Vitulus 每个名字都是同一个预制件的克隆我确信有一个对撞机。我已经尝试使用不同的半径,结果是一样的,overlapCircleAll 返回一些碰撞器,但不是一些靠近生成位置的碰撞器,所以会发生重叠......
-
如果 OverlapCircleAll 返回一些碰撞器,它应该总是靠近生成位置(又名 futurePosition)。确定不是这样吗?