Пятница, 08 Ноября 2024, 16:50

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
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
почти ветеран
Сейчас нет на сайте
не моя это цитата smile

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 дело говорит smile ограничь движение по одной оси (синий будет как по линейке ходить :)) и, когда коллайдер синего столкнется с коллайдером стены, останови синего smile
главное, чтобы кубик в хвост или в морду не зашел. но это должно вылечиться большЕй массой синего пот отношению к зеленому...
а то мы тут в высшие материи все - унитарность, универсальность кода. Я вот лично просмотрел, что движение лишь по одной оси.


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.
Все работает как хотел)
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг