Судно на воздушной подушке на Unity 3D

от автора

Учебные материалы для школы программирования. Часть 14

Предыдущие уроки можно найти здесь:

Сегодня мы настроены на отдых и развлечения! Поэтому, этот урок будет простой и «короткий». Мы не будем работать с графикой (но вас никто не ограничивает в праве усовершенствовать проект), уделим внимание управлению и работе с физикой, на примере создания судна на воздушной подушке.

Порядок выполнения

Создадим новый проект, импортируем в него приложенный ассет. В данном ассете содержится модели, звук и простая сцена.

Первое, что нам необходимо сделать — это установить на сцену модели карты и СВП, затем создать материал с нулевым трением и назначить его юбке СВП

На само судно устанавливаем Rigidbody со следующими параметрами:

Обратите внимание, что на коллайдерах установлена галочка Convex, а Rigidbody не имеет галочку использования гравитации. Вместо неё используется ConstantForce с довольно большим значением, направленная вниз.

Как видите, на скриншоте уже наложен скрипт. Но до того, как приступать к нему, необходимо установить рулевые лопатки.
Также, на модель в точках установки рулевых лопаток, установлены пустые гейм-обджекты с названием Gizmo, в них и уложены сами лопатки.

Скрипт конфигурируется согласно позапрошлому скриншоту. Полный листинг скрипта выглядит таким образом:

using UnityEngine; using System.Collections;   public class Howercraft: MonoBehaviour {      public Rigidbody HowercraftRigidbody; // риджитбади      public Transform CenterOfMass; // центр масс     public float power = 25000; // мощность вперёд/назад     public float torque = 25000; // мощность влево/вправо     float finAngle; // угол отклонения лопаток      float pitch; // питч для звука     public Transform[] Fins; // массив с лопатками     public AudioSource mainEngine; // звук основного двигателя         public AudioSource pushEngine; // звук турбин       // Use this for initialization      void Start() {         HowercraftRigidbody.centerOfMass = CenterOfMass.position - HowercraftRigidbody.position; // устанавливаем центр масс     }       // Update is called once per frame     void Update() {                  float inpFB = Input.GetAxis("Vertical"); // ввод вперёд/назад         float inpLR = Input.GetAxis("Horizontal"); // и влево/вправо                Vector3 vely = new Vector3(HowercraftRigidbody.transform.forward.x, 0, HowercraftRigidbody.transform.for ward.z); // находим вектор приложения силы            float gain = Mathf.Clamp01(HowercraftRigidbody.transform.up.y); // если перевёрнуты, силы будут равны нулю               HowercraftRigidbody.AddForce(vely * power * inpFB * gain, ForceMode.Force); // добавляем линейные силы                HowercraftRigidbody.AddRelativeTorque(0, torque * inpLR * inpFB * gain, 0, ForceMode.Force); // и поворот                finAngle = Mathf.Lerp(finAngle, -45 * inpLR, Time.deltaTime / 0.2f); // угол лопаток              foreach(Transform Fin in Fins) {             Fin.localEulerAngles = new Vector3(0, finAngle, 0); // выставляем угол          }         mainEngine.pitch = 0.9f + HowercraftRigidbody.velocity.magnitude / 60f; //высота звука основного двигателя                 pitch = Mathf.Lerp(pitch, Mathf.Abs(inpFB) * 1.3f, Time.deltaTime / 0.5f); // высчитываем высоту звука турбины                 pushEngine.pitch = 1f + 2f * pitch;         pushEngine.volume = 0.3f + pitch / 3f;     } } 

При этом скрипт лучше давать последовательно, сначала физический движок, потом звуковой.

Готово!

ссылка на оригинал статьи https://habr.com/ru/post/552834/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *