| 
	
		
		
			| Реализация столкновений в 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 (  ) А танк врага не будет при этом останавливаться? будет. а как он должен действовать при столкновении?? как ни в чем ни бывало ехать дальше?
 тогда лучше - второй вариант организации взаимодействий - убрать всю физику!
 
 Мыслю - значит программирую...
 Конструктивная критика - умных ведет к совершенству...
 Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.
 |  |  |  |  |  
 |