Menu
CoddyTech

Двигаться к точке

Часть раздела Основы скриптинга в 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 для плавного замедления.

challenge icon

Задание

Средне

Направь дрон на посадочную площадку при нажатии клавиши Space.

  1. Добавь поля bool flying; и bool landed;. При вызове Input.GetKeyDown(KeyCode.Space) установи flying = true;.
  2. Пока выполняется условие flying && !landed, перемещай дрон с помощью Vector3.MoveTowards(transform.position, pad, speed * Time.deltaTime).
  3. Когда 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

Потренируйтесь самостоятельно: Песочница Unity