OnCollisionEnter() не работает в Unity3D

У меня есть объект с коллайдером сетки и сборный с коллайдером сферы. Я хочу, чтобы экземпляр сборного дома был уничтожен, если они столкнутся.

Я написал следующее в сценарии:

private void OnCollisionEnter(Collision c)
{
    if (c == target)
        Destroy(transform.gameObject);
    print("something");                   // Doesn't get printed
}

Но это не работает. Я попытался переключить isTrigger на обоих объектах.

Ответ 1

У меня была та же проблема, что OnCollisionEnter не OnCollisionEnter, и нашел этот вопрос.

Для меня проблема заключалась в том, что я делал 2D-игру, поэтому ответом является использование функции OnCollisionEnter2D.

Ответ 2

Посмотрите на этот стол

Если вы хотите, чтобы ваш OnCollisionEnter вызывался, убедитесь, что:

(а) К обоим объектам прикреплен коллайдер.

(b) Ни один из объектов не является триггером-триггером (это вызовет функцию OnTrigger, а не OnCollisionEnter)

(c) Один из объектов (не имеет значения, какой из них) является жестким, не кинематическим и нестатическим объектом (второй не обязательно должен быть твердым телом).

(d) Из-за вычислительных трудностей MeshCollider может столкнуться с трудностями при столкновении с другими мешами, используйте их с осторожностью.

(д) Убедитесь, что оба объекта находятся в одном слое.

example colider configuration

Ответ 3

Убедитесь, что у одного из них имеется некинематический жесткий диск. Взято из документов Unity:

Когда возникает столкновение между двумя коллайдерами и , если хотя бы один из них имеет прикрепленный Rigidbody, три сообщения о столкновении отправляются к прикрепленным к ним объектам. Эти события могут обрабатываться в сценариях и позволяют создавать уникальное поведение с использованием или без использования встроенного ядра NVIDIA PhysX.

Отсюда: Unity3D MeshCollider

Ответ 4

Вы пытались использовать класс OnTriggerEnter() и устанавливали коллайдер объекта на триггер?

Если ему не нужно сообщать, с чем он сталкивается, вы можете сделать простой

void OnTriggerEnter(){
Destroy(transform.gameObject);
}

Edit:

Также я сделал OnCollision, как этот

private string hitobject;

void OnCollisionEnter(UnityEngine.Collision hit)
{
    hitobject = hit.gameObject.tag;
    if(hitobject == "Plane")
    {
        isgrounded = true;
    }
}

Ни один из объектов не является триггером, и им не нужны рабочие тела, чтобы работать.

Ответ 5

У меня была похожая проблема. Коробчатый коллайдер был не таким большим, как объект столкновения. Установка значений x и z на 2 единицы устранила проблему!