【问题标题】:Detecting if two game objects are overlapping / intersecting Unity检测两个游戏对象是否重叠/相交 Unity
【发布时间】:2018-12-17 05:45:36
【问题描述】:

我有一个我认为是直截了当的问题,但我缺乏统一知识阻碍了我。

我的场景中有原始类型的游戏对象(例如立方体/胶囊/球体)以不同的角度旋转。它们已经被实例化了。

然后我向场景中添加一个新的游戏对象基元类型,我想知道这个新的游戏对象是否与场景中的当前基元类型重叠/相交。

为此,我一直在使用gameobject1.GetComponent<Collider>.bounds.Intersects(gameobject2.GetComponent<Collider>.bounds)

但是这不起作用,因为 bounds 是一个边界框,所以即使游戏对象没有直接在视觉上接触原始类型游戏对象之一,如果它在它的边界框中,它也会返回 true(即它们相交)这不是我想要的:

我确信还有另一种统一的方法,但我只是不知道我需要做什么!

任何帮助将不胜感激。谢谢

【问题讨论】:

  • 应该可以修改boundingbox大小。

标签: c# unity3d


【解决方案1】:

您可以改用 MeshCollider(只要您的对象很简单),然后将 MeshCollider IsTrigger 属性设置为 true。

然后在代码中你可以这样做:

void OnTriggerEnter(Collider col)
{
}

void OnCollisionEnter(Collision col)
{
}

当一个物体进入碰撞器时,上面的函数将被调用,你可以在那里做你需要做的事情。

编辑:您的对象需要添加一个刚体才能使碰撞起作用

【讨论】:

  • 另外,如果你只是想知道两个物体是否相互接触,你可以使用docs.unity3d.com/ScriptReference/Collider.OnCollisionEnter.html
  • 所有对象都是原始类型,如立方体、球体和圆柱体。我假设他们已经有了刚体,因为他们是统一引擎的一部分?
  • @Mah 是的,我只需要知道它们是否接触,真假
  • 不,你必须添加它们,添加组件 > 刚体。如果您不希望它受到物理影响,则应将其标记为 Kinematic
【解决方案2】:

使用MeshCollider,而不是BoxCollider

void OnCollisionEnter(Collision collision)
{
    foreach (ContactPoint contact in collision.contacts)
    {
        Debug.DrawRay(contact.point, contact.normal, Color.white);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-28
    • 2016-04-16
    • 2013-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多