Способы обнаружения 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