我正在尝试编写一个脚本,在屏幕上的任意位置实例化一个正方形的预制件。如果这个空间已经被一个先前实例化的正方形所占据,它应该只在控制台中写一些东西。下面是我写的代码:
public void SpawnSquares(int difficulty){
float R1=Random.Range(25.0f,_screenWidth);
float R2=Random.Range(25.0f,_screenHeight);
_overlapA=new Vector2(R1-50f,R2+50f);
_overlapB=new Vector2(R1+50f,R2-50f);
if(Physics2D.OverlapArea(_overlapA,_overlapB,layermask,Mathf.Infinity,Mathf.Infinity)==null){
_position=Camera.main.GetComponent<Camera>().ScreenToWorldPoint(new Vector3(R1,R2,10));
Instantiate(Resources.Load("Square",typeof (GameObject)),_position,Quaternion.identity);
}
else{
Debug.Log("avoided collision");
}
}
层掩码变量被设置为layermask=1<<9;因为所有的方块都位于第9层。
我期望这样做是产生一个随机的位置,并修改_overlapA和_overlapB,以考虑广场的大小,然后检查是否有对撞机在该特定的区域。如果没有(OverlapArea()==null),则应该在该位置生成一个新的正方形。如果空间被占用,只需写到控制台即可。
到底发生了什么?执行永远不会在never上分支,因此这意味着Physics2D.OverlapArea(_overlapA、_overlapB、Layer掩码、Mathf.Infinity、Mathf.Infinity)总是返回null。但是,在调用SpawnSquares()大约10次之后,屏幕上几乎满是正方形,所以它至少应该检测到一个对撞机。
我做错了什么?我的项目已经停滞了两天,因为我似乎无法解决这个问题,所以任何帮助都将是非常感谢的。
耽误您时间,实在对不起!
发布于 2015-04-25 21:13:04
您有一个逻辑错误,但您显然是在正确的道路上。只是漏掉了检查的主要概念。
3主要问题。
这里的逻辑说,嘿,看看我的Physics2d。如果我与"MyOwn _overlapA和_overlapB“重叠,那么它将被实例化,这将始终返回true,但它还没有实例化,这意味着它总是会给出假的。
要解决这个问题,您需要告诉它与游戏中存在的“其他Physics2d”进行比较。
示例
if(Physics2D.OverlapArea(otherphysics2d.overlapA,otherphysics2d.overlapB
这是你需要列出的部分
// Needs to be out of the Method to be accessible to all.
public List<GameObject> mySpawns = new List<GameObject>();
在实例化它们之后,将它们添加到列表中,如下所示。
if(Physics2D.OverlapArea(_overlapA,_overlapB,layermask,Mathf.Infinity,Mathf.Infinity)==null){
_position=Camera.main.GetComponent<Camera>().ScreenToWorldPoint(new Vector3(R1,R2,10));
GameObject newGameObject = Instantiate(Resources.Load("Square",typeof (GameObject)),_position,Quaternion.identity);
mySpawns.Add(newGameObject);
}
else{
Debug.Log("avoided collision");
}
// Take note that if you miss a cast for some reason, just add "as GameObject" at the end to DownCast it.
欢迎来到StockOverflow
发布于 2022-08-10 01:51:13
我知道这是一个7岁的帖子,但既然另一个答案是错的,我想我还是会回答的。
OverlapArea()调用的唯一错误是,您正在检查具有最小和最大无限深度的对撞机。由于在无穷远和无限之间没有值,所以不会有对撞机返回。唯一需要进行的更改是将最小值更改为Mathf.NegativeInfinity
。
https://stackoverflow.com/questions/29865107
复制相似问题