首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >理解和使用联合的Physics2D.OverlapArea()

理解和使用联合的Physics2D.OverlapArea()
EN

Stack Overflow用户
提问于 2015-04-25 12:23:00
回答 2查看 3.2K关注 0票数 0

我正在尝试编写一个脚本,在屏幕上的任意位置实例化一个正方形的预制件。如果这个空间已经被一个先前实例化的正方形所占据,它应该只在控制台中写一些东西。下面是我写的代码:

代码语言:javascript
运行
复制
    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次之后,屏幕上几乎满是正方形,所以它至少应该检测到一个对撞机。

我做错了什么?我的项目已经停滞了两天,因为我似乎无法解决这个问题,所以任何帮助都将是非常感谢的。

耽误您时间,实在对不起!

EN

回答 2

Stack Overflow用户

发布于 2015-04-25 21:13:04

您有一个逻辑错误,但您显然是在正确的道路上。只是漏掉了检查的主要概念。

3主要问题。

  1. 您正在检查您的预实例化Physics2d,因此无论发生什么,它都将返回空; if( _position=Camera.main.GetComponent().ScreenToWorldPoint(new Vector3(R1,R2,10));实例化(Resources.Load(“Square”,typeof (GameObject)),_position,Quaternion.identity);{Debug.Log(“避免碰撞”)};

这里的逻辑说,嘿,看看我的Physics2d。如果我与"MyOwn _overlapA和_overlapB“重叠,那么它将被实例化,这将始终返回true,但它还没有实例化,这意味着它总是会给出假的。

要解决这个问题,您需要告诉它与游戏中存在的“其他Physics2d”进行比较。

示例

代码语言:javascript
运行
复制
if(Physics2D.OverlapArea(otherphysics2d.overlapA,otherphysics2d.overlapB
  1. 现在理解第一个解决方案,会让你思考第二个问题。我如何引用我实例化的那些?我怎样才能得到他们的Physics2D?

这是你需要列出的部分

代码语言:javascript
运行
复制
   // Needs to be out of the Method to be accessible to all.
     public List<GameObject> mySpawns = new List<GameObject>();

在实例化它们之后,将它们添加到列表中,如下所示。

代码语言:javascript
运行
复制
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.
  1. 检查部分是如何检查每个列表。使用方便。 foreach(GameObject check in mySpawns) { vector2 MyX =check.Collider2D.Trans.x;vector2 MyY =check.Collider2D.Trans.y;if(Physics2D.OverlapArea(MyX,MyY,层掩码,Mathf.Infinity,Mathf.Infinity)==null){ vector2 Vector3(R1,R2,10);GameObject newGameObject =实例化(GameObject(“Square”,typeof (NewGameObject)),,);mySpawns.Add(newGameObject);}Debug.Log(“避免碰撞”);}
  2. 最后是你自己能做什么。只需在预制件上添加一个Physics2D组件,并确保里面没有物理成分,因为它是3D的。

欢迎来到StockOverflow

票数 1
EN

Stack Overflow用户

发布于 2022-08-10 01:51:13

我知道这是一个7岁的帖子,但既然另一个答案是错的,我想我还是会回答的。

OverlapArea()调用的唯一错误是,您正在检查具有最小和最大无限深度的对撞机。由于在无穷远和无限之间没有值,所以不会有对撞机返回。唯一需要进行的更改是将最小值更改为Mathf.NegativeInfinity

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29865107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档