如何从触发器获取接触点?

How to get contact points from a trigger?

我的情况是我需要一个不会碰撞但也会给我接触点的 2d 传感器。

触发器不给我接触点,碰撞器给我接触点但会导致碰撞。

我曾尝试在使用碰撞器时禁用碰撞,希望获得碰撞输入回调但实际上并没有发生碰撞,但没有成功。

那么如何从触发器中获取接触点呢?或者如何在不引起碰撞的情况下获得与刚体的碰撞回调?

基本上我有一个圆圈我想充当雷达,但我希望它的接触点也相当准确。

你应该使用 OnCollisionEnter 但添加一个 rigidbody 并将 isTrigger 设置为 false 并将刚体 isKinematic 设置为 true然后它就像一个触发器,你可以得到这样的接触点

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

您可以使用 OnTriggerEnter 函数获取联系点

OnTriggerEnter(Collider other)
{
    RaycastHit hit;
    if (Physics.Raycast(transform.position, transform.forward, out hit))
    {
        Debug.Log("Point of contact: "+hit.point);
    }
}

发布是因为这是 Google 的最高结果。

我认为有一种比光线投射更简单(当然取决于您如何看待它)和更精确的方法。

private void OnTriggerEnter(Collider collider)
{ 
    var collisionPoint = collider.ClosestPoint(transform.position);
}

collider 是进入问题触发器的对撞机,transform 是触发器的变换。正如函数名称所暗示的那样,此填充在对撞机上最接近所述触发器的位置找到一个点。 当然,这并不是特别精确,尤其是对于形状怪异的碰撞器,但很可能它对于大多数情况来说已经足够好了,对于射弹来说绝对足够好了,或者说,blade,击中刚体角色。

作为奖励,这里有一个简单的矢量数学来找到碰撞法线:

var collisionNormal = transform.position - collisionPoint;

同样,不是非常精确,也不会是撞击点的实际适当法线(即垂直),但与前一个一样 - 很可能会足够好。

玩得开心!