Среда, 18 Декабря 2024, 16:00

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

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

Добавлено (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 мин (отвлекали постоянно) на коленке из подножных материалов.. smile
удачи и реализации.


Мыслю - значит программирую...
Конструктивная критика - умных ведет к совершенству...
Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.


Сообщение отредактировал KamiRonin - Понедельник, 17 Августа 2015, 14:10
KamiRoninДата: Среда, 19 Августа 2015, 08:15 | Сообщение # 16
почти ветеран
Сейчас нет на сайте
иии тишинаа.. smok

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

будет. а как он должен действовать при столкновении?? как ни в чем ни бывало ехать дальше?
тогда лучше - второй вариант организации взаимодействий - убрать всю физику!


Мыслю - значит программирую...
Конструктивная критика - умных ведет к совершенству...
Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

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