2013-08-16 14 views
7

У меня есть объект с сетчатым коллайдером и сборный с шаровым коллайдером. Я хочу, чтобы экземпляр сборника был уничтожен, если они столкнулись. я написал следующее в скрипте:OnCollisionEnter() не работает в Unity3D

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

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

+0

Вы уверен, что коллайдеры вступают/ударяя друг друг? –

+1

Какой тип 'target'? Я не думаю, что 'c == target' никогда не будет« истинным », но вы все равно должны будете напечатать свое сообщение. Возможно, вы ищете 'c.gameObject == target'. http://docs.unity3d.com/Documentation/ScriptReference/Collision-gameObject.html –

+0

коллайдеры пересекают друг друга, я видел с разных сторон в Scene View. –

ответ

5

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

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

Отсюда: Unity3D MeshCollider

+0

Я добавил не-кинематическое Жесткое тело к объекту без гравитации. Произошла некоторая ошибка: Актер :: updateMassFromShapes: вычислить тензор инерции сетки не удалось для одной из форм сетки актера! Пожалуйста, измените геометрию сетки или подайте тензор вручную! –

+0

В моем проекте шар неподвижен, а другой объект движется только потому, что он является дочерним элементом другого объекта, который перемещается только посредством преобразований и поворотов. –

+0

Ошибка формы сетки может означать, что у вас есть сетка, которая не может быть преобразована в хорошее физическое твердое тело. Можете ли вы заменить сетку с помощью примитива, чтобы узнать, помогает ли это? – theodox

1

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

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

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

Edit:

Кроме того, я сделал OnCollision как этот

private string hitobject; 

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

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

15

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

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

+7

Никто не упомянул об этом на весь интернет, кроме вас. –

+5

Спасибо! И аргумент 'Collsion collsion' должен быть' Collision2D' тоже. – OdraEncoded

2

Посмотрите this table

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

(а) Оба объекта имеют коллайдер прилагается.

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

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

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

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

example colider configuration