|
OnCollisionEnter2D и объект с Is Triger
|
|
| [1] NazNaz [04 Октября 2014, 03:22] |
Создал кинематический объект, создал и накинул скрипт: function OnCollisionEnter2D(coll: Collision2D) { Debug.Log("obj= "+сoll); } но при столкновении ничего не происходит, никак не пойму что не так, может столкновения с кинематическими телами нужно как то по другому определять? |
|
| [2] Lertmind [04 Октября 2014, 05:46] |
Столкновения не обрабатываются, если Is Kinematic = true. Если даже Is Kinematic = false, то с объектом Is Trigger = true не будет обработки. Вот в этой статье есть крутые таблицы (Collision Matrix, Trigger Matrix), где указано что с чем будет вызывать OnCollision и OnTrigger. UPD: Таблицы на сайте Unity.
Сообщение отредактировал Lertmind - Суббота, 04 Октября 2014, 17:50 |
|
| [3] NEBR [04 Октября 2014, 12:25] |
|
Lertmind, хорошая статья, добавил ее в закладки. Приходилось раньше методом тыка перебирать объекты, смотреть будет ли столкновение |
|
| [4] Lertmind [04 Октября 2014, 17:47] |
|
NEBR, я как-то не искал источник, нашёл на сайте Unity эти таблицы. |
|
| [5] NazNaz [08 Октября 2014, 13:24] |
Lertmind , спасибо за таблицы. Но я вот ломаю голову, как лучше реализовать такое: Синий обект после нажатия на него должен двигаться по оси Х, не должен реагировать на удары с зелеными объектами(отлетать в сторону и тд), и остановиться у красной стенки. но зеленые обекты должни реагировать на столкновение с синим. |
|
| [6] allods [08 Октября 2014, 14:43] |
можно через скрипт отключать коллизию с определенными коллайдерами.
Вам вот тут это сюда клик клик
Сообщение отредактировал allods - Среда, 08 Октября 2014, 14:45 |
|
| [7] NazNaz [08 Октября 2014, 23:30] |
|
allods , вы меня не так поняли, мне нужно чтобы при столкновении зеленого с синим в сторону отлетал только зеленый, а синий продолжал движение по оси Х, думал такое можно реализовать с помощю Is Kinematic, но не понимаю как его теперь остановить у красной стенки. |
|
| [8] MANMANA [09 Октября 2014, 11:24] |
варианты: 1) массу синего сделать большой, массу зеленого - маленькой; 2) измеряй расстояние до стенки и включай кинематику "GameObject.rigidbody.isKinematic = true;", например, пока он у тебя не оттолкнется от стенки; 3) определяй силу, точку и вектор, которые прикладывает к синему кубу зеленый объект в момент столкновения и прикладывай в этот же момент времени силу в точке и с направлением согласно третьему закону Ньютона F=-F сила с вектором (GameObject.rigidbody.AddForce(5, 0, 0); сила с вектором в локальной системе координат GameObject.rigidbody.AddRelativeForce(0, 0, 5);); применение силы из указанной точки - GameObject.rigidbody.AddForceAtPosition(Vector3(0, 5, 7), ЗЕЛЕНЫЙ_СВИСТОК.transform.position); 4) сделать вокруг синего квадрат, сделать дочерним к синему папе (хм....), отключить/сделать невидимым дочерний объект. коллайдер продолжает работать. при столкновении зеленого с дочерним коллайдером синего, отключать коллайдер (да через тот же isKinematic) у синего папы. По выходе зеленого коллейдера из дочернего зеленого - включать коллайдер у папы.
моменты для обмозговывания: GameObject.rigidbody.Sleep(); - усыпляем объект и перестаем рассчитывать для него физику; GameObject.rigidbody.IsSleeping(); - объект спит?; GameObject.rigidbody.WakeUp(); - будим объект;
Полезное: CollisionDetectionMode.;
Сообщение отредактировал MANMANA - Четверг, 09 Октября 2014, 11:25 |
|
| [9] allods [09 Октября 2014, 13:39] |
Цитата MANMANA (  ) думал такое можно реализовать с помощю Is Kinematic, но не понимаю как его теперь остановить у красной стенки.
Можно включить IsKinematic и двигать не через ригидбади а через transformTranslate.
Коллизия будет срабатывать только у зеленый а синий будет лететь как не в чем не бывало |
|
| [10] MANMANA [09 Октября 2014, 13:51] |
не моя это цитата  |
|
| [11] NovaSurfer [10 Октября 2014, 02:07] |
Если я вас правильно понял, то это реализуется очень просто. Начнем с синего квадрата. Находите rigidbody, потом внизу Constraints, открываете, нам надо отключить передвижение в y,z. Выбераем freeze position соответственно. Теперь по поводу передвижения. Вам надо сделать маленький цикл, а именно: до тех пор, пока квадрат не столкнулся со стеной rigidbody2D.velocity.x =5 (допустим). Теперь разберемся с зелеными шариками во первых их масса должна быть меньше квадрата, чтобы он двигался с постоянной скоростью или же не отлетал от шаров назад(-x). Для лучшего отскока шаров можно использовать физические материалы(PhysicsMaterial2d), с их настройками легко разобраться. Я думаю это все.
И на будущее, кто-то выше писал, что когда Kinematic = true, то колллизия игнорируется. Так вот это неправда, в документации написано, что для функции OnCollisionEnter() хватает одного Rigidbody на одном из контактирующих объектов даже если кимематика включена. Если у вас тригер, то используйте OnTriggerEnter2D()
Сообщение отредактировал NovaSurfer - Пятница, 10 Октября 2014, 02:12 |
|
| [12] MANMANA [10 Октября 2014, 11:29] |
хм... а ведь NovaSurfer дело говорит ограничь движение по одной оси (синий будет как по линейке ходить :)) и, когда коллайдер синего столкнется с коллайдером стены, останови синего главное, чтобы кубик в хвост или в морду не зашел. но это должно вылечиться большЕй массой синего пот отношению к зеленому... а то мы тут в высшие материи все - унитарность, универсальность кода. Я вот лично просмотрел, что движение лишь по одной оси.
Сообщение отредактировал MANMANA - Пятница, 10 Октября 2014, 11:31 |
|
| [13] allods [10 Октября 2014, 13:59] |
|
2D rigidbody нельзя ограничить по оси |
|
| [14] MANMANA [10 Октября 2014, 14:31] |
А всегда есть болт с резьбой: выбираем 'Fixed Angle' в rigidbody2d. Или так Slider Joint 2D
Сообщение отредактировал MANMANA - Пятница, 10 Октября 2014, 14:32 |
|
| [15] NazNaz [10 Октября 2014, 16:50] |
Всем большое спасибо за советы) Красние стенки сделал тригерами, при столкновении синего квадрата(Is Kinematic=true) с ними задаю velocity(0,0) и останавливаю, зеленые просто rigidbody2d. Все работает как хотел) |
|