🇺🇦 Домой

Делаю машинки часть 2 ("аркадная" машинка в unity)

В первой части я настрадался с встроенными колёсиками и решил делать аркадную модель самому.

С Wheel collider я еще немного повозился, вот до этого этапа:

Как делают АРКАДНЫЕ гоночки? - Я не знал, мужики. И вы может тоже не знаете, но я сейчас расскажу.

Часть вторая - "аркадная" машинка

Идея на какую мне сразу хватало мозгов две недели назад:

  • взять встроенную физику
  • взять прямоугольную коробочку для определения столкновений
  • когда газуешь - прикладывать момент силы (импульс) - вперёд
  • при повороте - прикладывать ко всему телу угловую силу, torque короче, чтоб заставить это беспредел вращаться

Критика этой идеи сейчас:

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

Детективное расследование

Путём гуглежа я набрёл на такой вот клипец.

Клипец очень классный, рекомендую, но если кому не охота смотреть - автор предлагает модель "парящей" машины, hover-car, будто у тебя на машине есть 4 "реактивных двигателя" какие в землю шмалят, как ракета, и держат твою машину в воздухе.

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

Raycast - это такой направленный "лучик", который если во что-то "упрётся" - возвращает тебе обьект в который упёрся и расстояние между вами.

Если дистанция до земли - равна или меньше "длины пружины нашей подвески" - применять силу, которая толкает тело ВВЕРХ.

Чем ближе мы к земле (сильней "сжата пружина") - тем сильней толкаем. На месте моих невидимых лучей силы разумеется можно нарисовать колёса и всё будет ништяк.

написал тупо, непонятно, надо было видео смотреть, я ж рекомендовал, ну что же вы

Идея не то чтоб новаторская, много кто так делает, вот например ещё более "прикладной" пример

Я решил - БУДУ ПИСАТЬ! Чтоб "заработало" ушло 2+ дня, вместо 16 переменных у меня было всего 3:

  1. Длина пружины
  2. Сила с какой пружина толкает rigidbody вверх
  3. Масса самой машины-коробочки

3 - не 16, можно подобрать, ага? вот 2 дня и подбирал :(

для того чтоб толкать машину вперёд, да и вверх тоже, я юзал RigidBody.AddForce(Vector3 v, ForceMode m), и я сам себе усложнил задачу, используя ForceMode.VelocityChange

В юнити есть 4 режима применения силы: Force, Impulse, Acceleration, VelocityChange. Разница как я её понимаю теперь:

  • Force (дефолтовая) - это та самая сила в ньютонах
  • Impulse - мы-то знаем что импульс - момент силы. А в юнити - разница в том как "часто" момент будет приложен к телу. Импульс - мгновенный, Сила - продолжительная. Сила - это условных "ньютонов в секунду", например. А импульс - тех же ньютонов "в 1 кадр".

Короче говоря, один и тот же вектор, с форс мод - Force - толкнёт тело "сильнее" чем с форс-мод импульс.

Если хочется "уравнять" силу СИЛЫ и ИМПУЛЬСА - вектор переданный в импульс надо умножить на дельту времени в мс между кадрами (Time.deltaTime)

а ещё есть

  • VelocityChange - force mode Force, который игнорирует массу тела, которе толкаем
  • Acceleration - то же что и импульс, только тоже массу игнорит.

Я везде выбрал VelocityChange, чтоб исключить массу машины из уравнения, и думать только о длине пружины и силе её "разгиба".

Как и в случае с Wheel collider, после того как я разобрался с ОТНОСИТЕЛЬНЫМИ направлениями всех моих рейкастов и векторов сил (чтоб они действительно в землю лупили) - всё по-прежнему упиралось в значения 2х волшебных чисел. И подобрать их было непросто вообще.

Помогло поменять ForceMode на всём на Force, умножить все мои "толкальные" силы на массу (для "газования" вперёд, прыжка и жесткости подвески) и подобрать такие значения длины пружины, и силы пружины, чтоб "компессия" пружинок была приблизительно 0.5 и ниже.

Массу я поставил 1, и эксперементальным путём не смог определить сколько ж силы нужно чтоб держать это в воздухе но не прыгать на месте как сумасшедший.

С массой 100 - либо лежу на земле и не двигаюсь - либо меня "прыгает" в небо на месте по всему уровню со старта

Поставил 1500 (будь это килограммы - было бы похоже на реальность ) и УРА: с силой 180-200 (ньютонов?) на одну пружину/реактивный двигатель, и длиной пружины 0,08(метров?) - завелось.

Думаю понятно почему без массы в полторы тонны я эти 0,08 я бы хрен подобрал.

Видео "УСПЕХА" прилагается:

    Значения в %% - это насколько "РАЗОГНУТА" каждая из пружин моей невидимой подвески.

Подбор волшебных чисел затянуло изучений документации для Raycast, въезжание в векторы и операции с ними, в то как дебажить юнити итд.

Еще помогло эти "лучики" с "дна рёбер" моей спичечной коробки, перенести немножко "внутрь", по всем осям.

Опять, я немножко ушёл в перерывы на моделирование препятствий, треков, систем чтоб делать ТРЮКИ итд..

но раз заметка - о аркадных машинках, то я хотел бы рассмотреть ещё один вариант, о каком я сам тоже думал еще в игре про скейт:

Здесь BoundingBox для детекции столкновений/для твёрдого тела - шар.

Моделька - не шар, а каркас невидимый - шар! Вот и всё блин :)

Наверняка сделать чтоб "работало" будет не так просто как кажется сейчас (парящая машина тоже простой казалась изначально), но сама идея - годная!

Выводы мои

Неутешные выводы :(
Сделать аркадную машинку - было интересненько и всё равно не очень и простенько. Ездит - лучше, но всё ещё не идеально.

Я ещё больше закопался в юнити, в векторы и весь этот движ. Я уже 2 раза заставил 2 разных машины поехать, осталось посмотреть как их возят другие люди в сурцах своих, выбрать какую-то одну систему за основу, и наконец-то сделать свою игру про водилу-трюкача, который делает ПОЛНЫЙ ПРОСКЕЙТЕР на машинке.

Часть третья, где просто читаю исходники других людей - следующая.

Если дочитали и не проблевались - обнял. Знаю что тяжело чёт написано.

14-11-2019, unity