除 OnCollisionEnter2D 之外的检测 2D 碰撞的方法

Ways to detect 2D collision other than OnCollisionEnter2D

这可能会被认为是一个愚蠢的问题,但在 if 语句中,是否可以检查该对象当前是否正在与另一个对象发生碰撞?

这是我最初的想法(在下面的代码片段中),但由于一些我无法弄清楚的奇怪原因,当对象被平台向上推动时,变量 onFloor 有时为假。

void OnCollisionEnter2D(Collision2D c)
{
    switch(c.gameObject.tag)
    {
        case "Platform":
            onFloor = true;
            break;
        default:
            break;
    }
}

void OnCollisionExit2D(Collision2D c)
{
    switch(c.gameObject.tag)
    {
        case "Platform":
            onFloor = false;
            break;
        default:
            break;
    }
}

因此,我问是否有任何方法可以在代码中检测所述对象的圆形碰撞器是否与相交对象的盒子碰撞器发生碰撞。 像

if(CircleCollider2D.CollidingObject != null && CircleCollider2D.CollidingObject.tag == "Platform")
{ /*Code I'd like to do here*/ }

现在这只是我的想象,试图想出一些可行的方法,但你明白了。

所以请问,有没有什么办法可以满足我的想象?

在与程序员讨论后,IsTouching 带有下划线并给出错误:'Collider2D' 不包含 'IsTouching' 的定义并且没有扩展方法 'IsTouching' 接受类型为 [ 的第一个参数=29=] 可以找到(您是否缺少 using 指令或程序集引用?)。

这里是精简代码:

using UnityEngine;

public class Ball : MonoBehaviour
{ 
    Vector2 jumpVelocity;
    public Collision2D platform;

    // Use this for initialization
    void Start()
    {
        jumpVelocity = new Vector2(0, rigidbody2D.gravityScale * 100);
    }

    void FixedUpdate()
    {
        if (Input.GetKey(KeyCode.Space) && collider2D.IsTouching(platform))
        {
            rigidbody2D.AddForce(jumpVelocity, ForceMode2D.Force);
        }
    }
}

请注意,即使将 collider2D 更改为 Collision2D 变量并采用 variable.collider.IsTouching 也会导致相同的错误。

也许您正在寻找的是 OnCollisionStay 方法,只要它们相互接触,这个方法就会触发。

此处 link 中有更多信息:https://docs.unity3d.com/ScriptReference/Collider2D.OnCollisionStay2D.html

Are there different solutions than OnCollisionEnter2D

。很多!

CircleCollider2D,其他 2D 碰撞器及其基础 class Collision2D,已内置函数来执行此操作。

public bool IsTouching(Collider2D collider); //Check collision by the provided collider
public bool IsTouchingLayers(); //Check collision by any collision
public bool IsTouchingLayers(int layerMask); //Check collision by layer
public bool OverlapPoint(Vector2 point); //Check collision by position

第一个函数更适合这个。

简单示例:

Collision2D collider1;
Collision2D collider2;

void Update()
{
    //Checks if collider1 is touching with collider2
    if (collider1.collider.IsTouching(collider2.collider))
    {

    }
}

使用 OnCollisionEnter2D 函数的示例:

public CircleCollider2D myCircleCollider;

void OnCollisionEnter2D(Collision2D c)
{
    if (c.collider.IsTouching(myCircleCollider))
    {

    }
}