Двигаться к точке
Часть раздела Основы скриптинга в Unity путешествия по Unity на Coddy. Урок 35 из 85.
Vector3.MoveTowards(current, target, maxStep) возвращает точку, которая находится не дальше чем на maxStep от target. Если цель ближе, функция возвращает саму цель, поэтому объект никогда не пролетает мимо неё. Если в качестве шага использовать speed * Time.deltaTime, объект движется с постоянной скоростью и останавливается точно в целевой точке. Эта канатная дорога плавно движется к станции со скоростью 2 единицы в секунду:
public Vector3 station = new Vector3(6, 3, 0);
public float speed = 2f;
void Update()
{
transform.position = Vector3.MoveTowards(transform.position, station, speed * Time.deltaTime);
}После прибытия каждый последующий вызов снова возвращает station, поэтому вагончик остаётся на месте, а выражение transform.position == station истинно. Для одного числа Mathf.MoveTowards работает так же.
Vector3.Lerp(a, b, t) возвращает точку, расположенную на доле пути t от a до b: при t = 0.5 она находится ровно посередине. Если написать Lerp(transform.position, station, 2f * Time.deltaTime) в Update(), на каждом кадре объект проходит часть оставшегося расстояния: сначала быстро, а ближе к концу всё медленнее, постепенно приближаясь к цели вместо того, чтобы двигаться с заданной скоростью. Используй MoveTowards, когда объект должен двигаться с заданной скоростью и остановиться точно в целевой точке; используй такой шаблон с Lerp для плавного замедления.
Задание
СреднеНаправь дрон на посадочную площадку при нажатии клавиши Space.
- Добавь поля
bool flying;иbool landed;. При вызовеInput.GetKeyDown(KeyCode.Space)установиflying = true;. - Пока выполняется условие
flying && !landed, перемещай дрон с помощьюVector3.MoveTowards(transform.position, pad, speed * Time.deltaTime). - Когда
transform.position == pad, установи значениеlandedи выведи в журналLanded.
Нажми «Играть», затем нажми Space: дрон приземлится на площадку. Затем нажми «Проверить».
Попробуйте сами
using UnityEngine;
public class Drone : MonoBehaviour
{
public Vector3 pad = new Vector3(0, 0.25f, 0);
public float speed = 2f;
void Update()
{
// После нажатия Space: лететь к pad со скоростью speed и при прибытии один раз вывести Landed в лог
}
}
Все уроки раздела Основы скриптинга в Unity
1Основы C# в Unity
Привет, UnityПеременныеДля дробных чисел нужна fТекст в консолиПеременные, которые запоминаютЕсли и иначеСравнение чиселПовторение: сборщик монет7Циклы и методы
Повторение с forЦиклы внутри цикловНапишите методМетоды, которые возвращают значениеМассивыПовторение: лестница10Поиск объектов
Поиск по имениТегиПоиск по типуСсылки лучше поискаNull в UnityПовторение: ближайшая монета13Проект: уворачиваемся от блоков
БегунБлоки с неба2Заставь двигаться
Размести кубДвигай каждый кадрПоворачивай каждую секундуУправляй клавишамиПовторение: веди куб5Векторы
Сложение векторовНаправленияЛокальное и мировое пространствоСкорость по диагоналиРасстояние между объектамиVector3 — это структураПовторение: пилот дрона8Игровые объекты и компоненты
Ссылки в InspectorПолучение компонентаОтсутствующие компонентыДобавление компонентаRequireComponentПоказ и скрытиеПовторение: выключатель света3Инспектор
Поля инспектораSerializeFieldЧисла с плавающей точкой и MathfАтрибуты инспектораПовторение: лифт6Трансформации и иерархия
Родители и детиПоднять флагМасштабСмотреть на объектыДвигаться к точкеПовторение: Луна на орбитеПотренируйтесь самостоятельно: Песочница Unity