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

本文关键字:2D 方法 碰撞 OnCollisionEnter2D 检测 | 更新日期: 2023-09-27 18:11:57

这可能是一个愚蠢的问题,但是在if语句中,是否有可能检查对象当前是否与另一个对象碰撞?

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

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'接受类型'Collider2D'的第一个参数可以找到(您是否缺少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变量并接受该变量。collider. istouching也会导致相同的错误。

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

是否存在与OnCollisionEnter2D不同的解

。很多人!

CircleCollider2D,其他2D碰撞器及其基类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))
    {
    }
}

也许你正在寻找的是OnCollisionStay方法,这个方法会触发只要他们彼此接触。

这里有更多的信息链接:https://docs.unity3d.com/ScriptReference/Collider2D.OnCollisionStay2D.html