Слайд 1 из 13
Простой дрон — тяга и ручное управление
Теперь применим повороты к объекту, который действительно двигается. Мы соберём простого дрона: один Rigidbody, направленная вдоль корпуса тяга и управление тремя осями вращения. На картинке четыре винта, но сегодня мы не считаем каждый винт отдельно. Сначала поймём связь между наклоном корпуса и движением. Это основа, к которой позже можно добавить более подробную модель роторов.
Слайд 2 из 13
Что должно работать к концу пары
Покажите студентам цель до начала кода. У нас четыре наблюдаемых результата: висение, высота, три оси поворота и горизонтальное движение из-за наклона. Если дрон просто перемещается transform.position по клавише W, нужного эффекта не будет. Сегодня силы и крутящие моменты должны менять движение Rigidbody. Отпускание клавиши не обязано мгновенно останавливать вращение: это как раз проблема для следующей пары.
Слайд 3 из 13
Простая модель сил
Здесь одна важная физическая связь. Гравитация всегда тянет вниз в мире. Тяга действует вверх относительно корпуса. Пока дрон горизонтален, эти направления противоположны и могут уравновеситься. Наклоните корпус — тяга наклонится, у неё появится горизонтальная составляющая. Поэтому движение вперёд появится из силы, а не из команды «перемести вперёд». Массу в формулах мы пока оставляем, а в коде используем режим ускорения, чтобы управление было проще настраивать.
Слайд 4 из 13
Предскажите движение
Не трогайте ползунки сразу. Попросите студентов предсказать два эффекта: движение вправо или влево и изменение высоты. Затем наклоните модель на двадцать-тридцать градусов, оставив тягу 9,81. Горизонтальное ускорение стало ненулевым, а вертикальное стало отрицательным: дрон летит в сторону и снижается. Можно попробовать немного увеличить тягу и найти значение, которое вновь удержит высоту. Это показывает, почему даже простое управление требует наблюдать положение корпуса.
Слайд 5 из 13
Соберите сцену Unity
Собираем самую простую сцену. Корпусом может быть куб, а четыре винта — плоские цилиндры или другие примитивы. Их красота на физику не влияет. Важно, чтобы Rigidbody был один на корневом объекте Drone, а дочерние части двигались с ним. Поднимите объект на два метра, чтобы сразу увидеть снижение. Проверьте Use Gravity, Is Kinematic и ограничения вращения. Если Rotation заморожен, скрипт управления не сможет наклонить корпус.
Слайд 6 из 13
Подготовьте ввод
До написания классов проверьте настройку ввода. Эти примеры используют namespace UnityEngine.InputSystem и Keyboard.current. Если пакет не установлен или включён только старый Input Manager, код не соберётся. Мы читаем состояние удерживаемой кнопки в FixedUpdate, потому что тяга непрерывна и должна применяться на каждом шаге физики. Это отличается от единичного события вроде выстрела, где нам нужен один импульс от одного нажатия.
Слайд 7 из 13
Тяга для висения
Начнём с висения. Земная гравитация примерно 9,81 метра в секунду за секунду вниз. Если в горизонтальном положении дать такую же величину тяги вверх, результирующее ускорение близко к нулю. Пробел увеличивает тягу, левый Control уменьшает её. В коде берём текущую Physics.gravity, а не жёстко записываем 9,81. Ограничиваем тягу снизу нулём: обычный винт может перестать толкать вверх, но не должен тянуть корпус вниз.
Слайд 8 из 13
Полный код `DroneLift.cs`
Пройдите код сверху вниз. RequireComponent сообщает Unity, что объекту нужен Rigidbody. В Awake получаем ссылку на него. В FixedUpdate читаем две удерживаемые клавиши и получаем climb: плюс один, минус один или ноль. Затем складываем ускорение висения и команду подъёма, не даём результату уйти ниже нуля и прикладываем его через AddRelativeForce. Слово Relative здесь главное: направление up берётся из повернутого корпуса. Полный файл можно скопировать кнопкой на слайде.
Слайд 9 из 13
Первая проверка в Play Mode
Не добавляйте управление поворотом, пока не прошла эта проверка. Запустите сцену и посмотрите на дрон без ввода. Небольшое движение из-за численного шага допустимо, но он не должен резко улетать. Теперь удерживайте пробел, потом левый Control. Если направление не то, проверьте локальную ось up объекта Drone: визуальная модель может быть повернута относительно корня. При ошибке в Console сначала исправьте её, а не компенсируйте непонятное поведение числами в Inspector.
Слайд 10 из 13
Три оси ручного управления
Вернёмся к yaw, pitch и roll из предыдущего занятия. Здесь вместо выставления угла напрямую мы прикладываем крутящий момент. W и S управляют тангажом вокруг локальной X, A и D — креном вокруг Z, Q и E — рысканием вокруг Y. Используем AddRelativeTorque: после разворота дрона клавиши всё ещё относятся к его корпусу, а не к неизменным мировым осям. Попросите студентов до запуска показать рукой, куда опустится нос от W.
Слайд 11 из 13
Полный код `DroneManualAttitude.cs`
Этот класс тоже живёт на объекте Drone. Сначала читаем удерживаемые клавиши как числа плюс один, минус один или ноль. Составляем Vector3 углового ускорения в порядке X, Y, Z: pitch, yaw, roll. Не перепутайте порядок с перечислением клавиш на предыдущем слайде. Затем вызываем AddRelativeTorque в режиме Acceleration. Значения в Inspector нужны для настройки; начните с предложенных в коде и меняйте один коэффициент за раз. Полный файл доступен через кнопку копирования.
Слайд 12 из 13
Испытание: короткое нажатие `W`
Теперь проверим обе части модели вместе. Коротко нажмите W и отпустите. Сначала видим наклон носа, затем горизонтальное движение и потерю высоты. Спросите студентов, почему после отпускания клавиши дрон не возвращается строго в горизонт. Управляющая сила исчезла, но угловая скорость уже накопилась; Angular Damping постепенно её уменьшает, однако сам угол не обязан вернуться к нулю. Не исправляйте это прямой записью transform.rotation: на следующем занятии добавим физическую коррекцию.
Слайд 13 из 13
Сохраните результат
На выходе нужна работающая и сохранённая сцена DroneManual. Быстро пройдите все клавиши и убедитесь, что в Console нет исключений. Сравните направление тяги на наклонённом корпусе с интерактивом в начале пары. Четыре видимых винта пока не участвуют в расчёте: мы сознательно применяли суммарную тягу и момент к одному Rigidbody. Это хорошая точка остановки. На следующем занятии сохраним эту сцену как контрольную и сделаем копию со стабилизацией.