如何在Unity C#中检测特定位置是否存在对象?

5
在这种情况下,我想用一个物体来填充一个空区域,但是如果该区域不为空,我就不想在那里放置一个物体。 特别是针对一个立方体,所以我不确定checkSphere()是否适用。 我是一个初学者,在寻找答案时遇到了很多麻烦,虽然我知道它可能在线上,但我很难找到一些能够让我理解代码的东西,甚至找到那段代码。

1
请进一步解释您的问题。 - Draco18s no longer trusts SE
1
吹毛求疵:向量是一个方向(没有起始位置),我猜你的意思是“在特定位置”。 - UnholySheep
你的游戏对象是否有刚体组件? - Serkan Pekçetin
3个回答

11

尝试使用Physics.OverlapSphere。您可以在您想要检查的Vector3点处定义一个球体(例如(2, 4, 0))。您可以给它一个小半径(甚至可能是0,但您需要检查一下,我不确定是否有效)。

它返回一个数组,其中包含所有接触或位于球体内的碰撞器。只需检查数组是否为空(或长度为0),如果是,则没有任何东西在接触。

您可以像这样使用它:

Collider[] intersecting = Physics.OverlapSphere(new Vector3(2, 4, 0), 0.01f);
if (intersecting.Length == 0) {
    //code to run if nothing is intersecting as the length is 0
} else {
    //code to run if something is intersecting it
}

或者,当然,您也可以这样做:

Collider[] intersecting = Physics.OverlapSphere(new Vector3(2, 4, 0), 0.01);
if (intersecting.Length != 0) {
    //code to run if intersecting
}

希望这可以帮到您!

编辑:这里有一个函数,如果一个点与碰撞器相交,则返回true。

bool isObjectHere(Vector3 position)
{
    Collider[] intersecting = Physics.OverlapSphere(position, 0.01f);
    if (intersecting.Length == 0)
    {
        return false;
    }
    else
    {
        return true;
    }
}

谢谢!我原本以为我懂了,但是收到了一个错误信息:“!运算符不能应用于操作数或类型'int'。” - Person
啊,我的错,你需要输入!(intersecting.Length == 0)而不是仅仅输入!intersecting.Length == 0。 - Lauren Hinch
3
为什么不直接返回 intersecting.Length != 0 呢?没有必要使用分支语句。(此外,intersecting.Length != 0通常比!(intersecting.Length == 0)更易读。) - UnholySheep
@UnholySheep 这是真的,但我想让它简单易懂,适合那些可能没有很多编程经验的人。我还决定分支而不仅仅返回布尔表达式,因为它与我之前提供的示例具有相同的模板。但是没错 - 你是对的。 - Lauren Hinch

0
你可以尝试这样做:
首先收集场景中的所有游戏对象。
GameObject[] allObjects = UnityEngine.Object.FindObjectsOfType<GameObject>() ;

稍后,您可以迭代所有这些gameObjects,检查它们的位置与您要匹配的PositionToMatch之间的距离,该向量应具有您想要检查是否已经存在任何内容的坐标。
foreach(object go in allObjects)
{
    float dist = Vector3.Distance(PositionToMatch, go.transform.position);
    if(dist <...)
        //Here what you need
}  

Vector3.Distance会返回距离。你可以根据游戏对象的大小(半径或直径)设置限制。


-1
你可以使用.contains()方法来检查对象是否存在,如果存在,则获取其位置。我需要看代码才能更准确地判断。

向量没有 contains() 方法,Unity 变换层次结构也没有。 - Draco18s no longer trusts SE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接