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

时间:2015-07-26 20:20:04

标签: c# unity3d unityscript

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

触发器不会给我联络点,而且碰撞器会给我联络点但会导致碰撞。

我曾尝试在使用碰撞器时试图禁用碰撞,希望碰撞进入回调但没有实际发生碰撞,但没有运气。

那么如何从触发器获取接触点?或者如何在不引起碰撞的情况下使用刚体进行碰撞回调?

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

3 个答案:

答案 0 :(得分:3)

您应该使用OnCollisionEnter但是向其添加rigidbody并将isTrigger设置为false并将刚体isKinematic设置为true然后将扮演触发器的角色,您可以获得这样的联络点

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

答案 1 :(得分:3)

您可以使用OnTriggerEnter功能

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

答案 2 :(得分:0)

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

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

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

collider 是进入相关触发器的碰撞器,transform 是触发器的变换。正如函数名称所暗示的那样,此填充在对撞机上最靠近所述触发器的点。 当然,这不是非常精确,尤其是对于形状怪异的对撞机,但很可能在大多数情况下它已经足够了,对于射弹,或者说,刀片,击中刚体角色来说绝对足够了。

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

var collisionNormal = transform.position - collisionPoint;

同样,不是非常精确,也不会是撞击点的实际正确法线(即垂直),但与之前的法线一样 - 很可能已经足够了。

玩得开心!