Способы обнаружения 2D-столкновений, отличных от 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", принимающий первый аргумент типа "Collider2D", не может быть найден (если вы пропустили использование директива или ссылка на сборку?).

Вот уменьшенный код:

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 приводит к той же ошибке.

2 ответа

Решение

Есть ли другие решения, чем 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

Другие вопросы по тегам