Путевые точки
Урок 1 из 18 курса Игра в Unity: защита башен на Coddy.
В этом курсе вы создадите игру в жанре tower defense. Враги волнами движутся по пути к вашей базе, а вы останавливаете их башнями, которые размещаете на строительных площадках, а затем улучшаете и продаёте. В каждом уроке добавляется одна функция. Все двенадцать скриптов игры находятся в проекте с самого начала; большинство из них — короткие заготовки, которые будут заполнены в последующих уроках.
Враг следует по пути через контрольные точки: пустые GameObjects на поворотах, расположенные в массиве в порядке прохождения. Враг хранит индекс контрольной точки, к которой направляется, движется к ней, а по прибытии переходит к следующей. Vector3.MoveTowards(current, target, maxStep) перемещает точку к цели не более чем на maxStep и никогда не дальше неё, поэтому враг оказывается точно в контрольной точке, а == позволяет определить, что он прибыл. Этот патрульный дрон летает между своими постами и начинает сначала после последнего:
public Transform[] posts;
public float speed = 3f;
private int current;
void Update()
{
Vector3 goal = posts[current].position;
transform.position = Vector3.MoveTowards(transform.position, goal, speed * Time.deltaTime);
if (transform.position == goal)
{
current = (current + 1) % posts.Length;
}
}Враг не движется по кругу: после последней контрольной точки ему некуда идти. Когда индекс достигает Length, он уже не указывает на контрольную точку, а чтение waypoints[waypoints.Length] вызывает исключение IndexOutOfRangeException, поэтому индекс проверяется перед использованием. Контрольные точки расположены на высоте 0.6 над землёй — на уровне центра врага, поэтому движение прямо к ним позволяет ему сохранять ноги на земле.
Задание
ЛегкоGrunt стоит на первой путевой точке, WP0, а в его скрипте Enemy уже есть восемь путевых точек в waypoints: от WP0 у места появления до WP7 у базы.
- Добавь private int
next: индекс путевой точки, к которой направляется Grunt. Он начинает с WP0, поэтомуnextначинается с 1. - В
Updateперемещай Grunt в направленииwaypoints[next]со скоростьюspeedединиц в секунду с помощьюVector3.MoveTowards. - Достигнув этой путевой точки, направляйся к следующей.
- После последней путевой точки остановись: больше никакого движения и никаких ошибок.
Нажми Play и посмотри, как Grunt проходит по пути, затем нажми Check.
Попробуйте сами
using UnityEngine;
public class Enemy : MonoBehaviour
{
public float speed = 2f;
public Transform[] waypoints;
void Update()
{
// Здесь двигайтесь по маршруту: от одной путевой точки к другой, по порядку.
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.