Реализация столкновений в 2D танчиках
| |
8Observer8 | Дата: Вторник, 14 Июля 2015, 14:25 | Сообщение # 1 |
заслуженный участник
Сейчас нет на сайте
| Привет,
Помогите, пожалуйста, реализовать столкновения двух танчиков: Player, Enemy. Пока, что у меня есть максимально упрощённый пример. Спрайт Enemy движется вниз с помощью transform.Translate(...), а на пути у него спрайт Player. На обоих объектах стоит BoxCollider2D (установлен флаг IsTrigger) и Rigidbody2D (установлен флаг IsKinematic)
Танком Player управляет пользователь. Когда танки врезаются, то в методе OnTriggerEnter2D я обоим спрайтам устанавливаю скорость в ноль. Дальше никак не могу сообразить, как продумать логику. Натолкните, пожалуйста, на правильные размышления.
|
|
| |
seaman | Дата: Вторник, 14 Июля 2015, 19:32 | Сообщение # 2 |
старожил
Сейчас нет на сайте
| Цитата стоит BoxCollider2D (установлен флаг IsTrigger) И как Вы собираетесь сталкивать триггеры? Цитата и Rigidbody2D (установлен флаг IsKinematic) Это тоже ошибка - кинематик нельзя ставить.
|
|
| |
8Observer8 | Дата: Вторник, 14 Июля 2015, 22:30 | Сообщение # 3 |
заслуженный участник
Сейчас нет на сайте
| Цитата seaman ( ) И как Вы собираетесь сталкивать триггеры? Я хотел при столкновении, к примеру, Player'а с препятствием занулять ему скорость в этом направлении. Допустим, стоит вражеский танк, а Player перемещаем снизу вверх. Он сталкивается, но дальше не может ехать, так как скорость в этом направлении будет зануляться в OnTriggerEnter2D (или OnTriggerStay2D). А в других направлениях Player может ехать. Но эта идея провалилась. Прошу помощи навести на правильный путь.
Цитата seaman ( ) Это тоже ошибка - кинематик нельзя ставить. В этом случае, у меня спрайты улетают. Я с физикой в 2D столкнулся впервые. Посоветуйте, как быть. Подскажите, как должно быть наиболее правильно?
Добавлено (14 июля 2015, 22:30) --------------------------------------------- Дело в том, что если я добавлю физику 2D, то я смогу двигать вражеские танки. Это неправильно. Разве нет?
Сообщение отредактировал 8Observer8 - Вторник, 14 Июля 2015, 22:31 |
|
| |
system | Дата: Вторник, 14 Июля 2015, 22:54 | Сообщение # 4 |
заслуженный участник
Сейчас нет на сайте
| Цитата 8Observer8 ( ) Дело в том, что если я добавлю физику 2D, то я смогу двигать вражеские танки. Это неправильно. Разве нет? ты не прав, если у танка масса больше то он вполне может столкнуть другой танк, да и на скоросте 50+ кмч хоть не много да сдвинешь танк, если масса танка в который врезаешься не на 5+ тонн больше... в общем возьми в wot поиграй и посмотри как ведут сеья танки Добавлено (14 июля 2015, 22:54) --------------------------------------------- и да ща опять модеры набегут и скажут что я обсераю проект, как всегда )
|
|
| |
seaman | Дата: Среда, 15 Июля 2015, 00:37 | Сообщение # 5 |
старожил
Сейчас нет на сайте
| Я плюнул на то, что танки могут сдвинуть друг друга. По крайней мере пока.
|
|
| |
8Observer8 | Дата: Среда, 15 Июля 2015, 07:07 | Сообщение # 6 |
заслуженный участник
Сейчас нет на сайте
| Цитата seaman ( ) Я плюнул на то, что танки могут сдвинуть друг друга. По крайней мере пока. А у вас танки могут разворачивать друг друга? Как этого избежать?
|
|
| |
seaman | Дата: Среда, 15 Июля 2015, 08:47 | Сообщение # 7 |
старожил
Сейчас нет на сайте
| В ригидбоди констрайнс.
|
|
| |
8Observer8 | Дата: Среда, 15 Июля 2015, 10:11 | Сообщение # 8 |
заслуженный участник
Сейчас нет на сайте
| Цитата seaman ( ) В ригидбоди констрайнс. Я расположил спрайты в проскости XZ. В Rigidbody 2D/Constraints/Freeze Rotation почему то можно поставить только галочку Z. То есть заморозить вращение вокруг Z. А мне нужно вокруг Y. Но это я делал, когда гравитация была включена. Я хотел перемещать спрайты по плоскости (по спрайту с BoxCollider2D). Нужно будет опять вернуть в плоскость XY. Тогда можну будет отпенить вращение вокруг Z.
Я убрал со спрайтов галочки IsKinematic, выставил GravityScale в ноль, выставил позиции спрайтов на одинаковой высоте, но спрайты проходять друг через друга и не упираются друг в друга. Перемещаю я их с помощью transform.Translate(...)
Сообщение отредактировал 8Observer8 - Среда, 15 Июля 2015, 10:26 |
|
| |
seaman | Дата: Среда, 15 Июля 2015, 13:12 | Сообщение # 9 |
старожил
Сейчас нет на сайте
| Цитата Я расположил спрайты в проскости XZ. Вы трехмерную что ли игру делаете? Зачем вообще в какой то плоскости самому размещать спрайты? Цитата Я убрал со спрайтов галочки IsKinematic, выставил GravityScale в ноль, выставил позиции спрайтов на одинаковой высоте, но спрайты проходять друг через друга и не упираются друг в друга. Перемещаю я их с помощью transform.Translate(...) У всех работает - у Вас нет. Не странно? Сделайте нормальный 2D проект. Спрайты в одном слое сортировки - Default. Z вообще не трогайте. Вы уроки смотрели?
|
|
| |
8Observer8 | Дата: Суббота, 18 Июля 2015, 00:36 | Сообщение # 10 |
заслуженный участник
Сейчас нет на сайте
| Цитата seaman ( ) Вы уроки смотрели? Да, посмотрел последний урок. Мне пригодилось, как по-настоящему отключить гравитацию: "Edit" -> "Project Settings" -> "Phisics 2D" -> set Y to 0. Думаю, разобрать код. Спасибо!
А то я зачем-то в "Rigidbody 2D" выставлял "Gravity Scale" в ноль и мне показалось, что так я отключал гравитацию. Хотя там написано, что это "Degree to which the object is affected by gravity." То есть это степень, с которой определяется подвержен ли объект гравитации. И вроде бы ноль должен указывать, что не подвержен.
Ситуация такая. Я вернул всё обратно. Сейчас всё нормально. OnCollisionEnter2D срабатывает. Вражеский танк едет. Я могу управлять танком Player. Мне не нравится, что я могу таранить танки, то есть сдвигать их с курса. Предложите, как это можно исправить?
Добавлено (15 июля 2015, 20:31) --------------------------------------------- seaman, а когда вы будете стрелять в бронированные танчики, они ведь будут оскакивать? У меня есть предположение, что нужно подобрать массы пули и танка так, чтобы этого не происходило.
Может лучше делать с включённым "Is Trigger" на BoxCollider2D?
Добавлено (16 июля 2015, 00:24) --------------------------------------------- Я понял, что игру нужно делать на триггерах. При OnTriggerEnter2D занулять скорость и запоминать блокирующее направление. При нажатии кнопок управления нужно проверять неблокирующее ли это направление, если нет, то сбрасывать переменную, которая хранит блокирующее направление и устанавливать скорость. А если направление блокирующее, то ничего не не делать, то есть оставлять скорость равной нулю.Добавлено (18 июля 2015, 00:36) --------------------------------------------- Замечу, что для снарядов не подходит "Box Collider 2D", так как они мелкие. Здесь нужен "Edge Collider 2D". Решение проблемы нашёл здесь.
Сообщение отредактировал 8Observer8 - Четверг, 16 Июля 2015, 00:34 |
|
| |
seaman | Дата: Суббота, 18 Июля 2015, 01:13 | Сообщение # 11 |
старожил
Сейчас нет на сайте
| Цитата Замечу, что для снарядов не подходит "Box Collider 2D" Да что Вы говорите? Что ж я такое неправильное делаю, что у меня они нормально работают? Объясните где я ошибаюсь плиз.
|
|
| |
8Observer8 | Дата: Суббота, 18 Июля 2015, 08:20 | Сообщение # 12 |
заслуженный участник
Сейчас нет на сайте
| Цитата seaman ( ) Что ж я такое неправильное делаю, что у меня они нормально работают? Я не знаю почему у вас работает, но как в этой заметки говориться, что если размер спрайта в несколько пикселей, то в секции компонента "Box Collider 2D" будет выдаваться сообщение "The collider did not create a collision shape…". Возможно у вас спрайт снаряда больше, чем несколько пикселей.
|
|
| |
seaman | Дата: Суббота, 18 Июля 2015, 11:17 | Сообщение # 13 |
старожил
Сейчас нет на сайте
| Верно, если коллайдер маленький - он не будет определять столкновения. Тоже самое было и в 3D. Только зависит это не от количества пикселей в спрайте, а от того какой у него физический размер. У меня снаряд 3*4 пикселя. Эксперимент показал, что в моем конкретном случае размер меньше 0,04 единиц делать нельзя. Причем это именно размер в боксколлайдере. Если при этом изменить масштаб спрайта (scale в transform) размеры коллайдера не меняются (то же самое число 0,04 единиц осталось!), а столкновения начинают нормально определяться. Вывод. Чтобы не было таких заморочек не нужно делать маленький размер камеры и большое число в PixelPerUnit в импортере спрайтов. Попробуйте изменить полностью масштаб игры - увеличить ортографический размер камеры и уменьшить PixelPerUnit.
Сообщение отредактировал seaman - Суббота, 18 Июля 2015, 11:17 |
|
| |
8Observer8 | Дата: Воскресенье, 16 Августа 2015, 21:21 | Сообщение # 14 |
заслуженный участник
Сейчас нет на сайте
| Цитата system ( ) ты не прав, если у танка масса больше то он вполне может столкнуть другой танк, да и на скоросте 50+ кмч хоть не много да сдвинешь танк, если масса танка в который врезаешься не на 5+ тонн больше... в общем возьми в wot поиграй и посмотри как ведут сеья танки Не может столкнуть, так как речь идёт об игре Battle City.
Сообщение отредактировал 8Observer8 - Воскресенье, 16 Августа 2015, 21:22 |
|
| |
KamiRonin | Дата: Воскресенье, 16 Августа 2015, 22:50 | Сообщение # 15 |
почти ветеран
Сейчас нет на сайте
| лови комплексный экземпл: столкновения (физика, гравитация, параметры масс), выстрел (физика и тп), движение, хитрость позволяющая обходиться без сложных вычислений для углов движения и выстрела вообще. сделано за 35 мин (отвлекали постоянно) на коленке из подножных материалов.. удачи и реализации.
Мыслю - значит программирую... Конструктивная критика - умных ведет к совершенству... Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.
Сообщение отредактировал KamiRonin - Понедельник, 17 Августа 2015, 14:10 |
|
| |
KamiRonin | Дата: Среда, 19 Августа 2015, 08:15 | Сообщение # 16 |
почти ветеран
Сейчас нет на сайте
| иии тишинаа..
Мыслю - значит программирую... Конструктивная критика - умных ведет к совершенству... Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.
|
|
| |
8Observer8 | Дата: Среда, 19 Августа 2015, 08:21 | Сообщение # 17 |
заслуженный участник
Сейчас нет на сайте
| За пример большое спасибо, но он не решает проблемы. Мне нужна физика (точнее её отсутствие), как в оригинальном Battle City, где нельзя двигать танки.
|
|
| |
KamiRonin | Дата: Среда, 19 Августа 2015, 08:31 | Сообщение # 18 |
почти ветеран
Сейчас нет на сайте
| Цитата 8Observer8 ( ) Мне нужна физика (точнее её отсутствие), как в оригинальном Battle City ииии кто бы знал!!? ( пиши топик внятно в другой раз! ( чтобы танки не двигались - в моем примере достаточно создать триггер вокруг вражеского танка и при попадании в него плейера - поставить очень большие величины у ригидбоди2д врага.. а при выходе из триггера возвращать обратно. во втором варианте можно вообще отказаться от физики и все делать на триггерах.. тогда будет "как в старое время"..
Мыслю - значит программирую... Конструктивная критика - умных ведет к совершенству... Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.
|
|
| |
8Observer8 | Дата: Среда, 19 Августа 2015, 08:39 | Сообщение # 19 |
заслуженный участник
Сейчас нет на сайте
| Цитата KamiRonin ( ) поставить очень большие величины у ригидбоди2д врага.. А танк врага не будет при этом останавливаться?
Сообщение отредактировал 8Observer8 - Среда, 19 Августа 2015, 08:40 |
|
| |
KamiRonin | Дата: Среда, 19 Августа 2015, 08:45 | Сообщение # 20 |
почти ветеран
Сейчас нет на сайте
| Цитата 8Observer8 ( ) А танк врага не будет при этом останавливаться? будет. а как он должен действовать при столкновении?? как ни в чем ни бывало ехать дальше? тогда лучше - второй вариант организации взаимодействий - убрать всю физику!
Мыслю - значит программирую... Конструктивная критика - умных ведет к совершенству... Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.
|
|
| |
|