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