Menu
CoddyTech

Три полосы

Часть раздела Создание настоящих игр путешествия по Unity на Coddy. Урок 27 из 56.

В этой главе мы создадим бесконечный раннер. Персонаж бежит по дороге с тремя полосами и перемещается между полосами, чтобы уклоняться от приближающихся препятствий. В следующих уроках дорога будет ускоряться, на экране будет отображаться пройденное расстояние, столкновение будет завершать забег, после чего можно будет начать заново, а лучший результат будет сохраняться. Персонаж никогда не движется вперёд: он остаётся на z = 0, а препятствия движутся к нему, поэтому дорога никогда не заканчивается. В игре четыре скрипта: Runner, Spawner, Obstacle и GameManager, и пока последние три пусты.

Персонажем, перемещающимся по полосам, управляют не как машиной: он всегда находится в одном из нескольких фиксированных мест. Храни место в виде целого числа, изменяй это число при нажатии клавиши и вычисляй по нему позицию. Платформа мойщика окон обслуживает пять этажей здания, расположенных на расстоянии 3 единиц друг от друга:

[SerializeField] private float floorHeight = 3f;
[SerializeField] private float moveSpeed = 6f;
private int floor = 0;

void Update()
{
    if (Input.GetKeyDown(KeyCode.UpArrow)) floor++;
    if (Input.GetKeyDown(KeyCode.DownArrow)) floor--;
    floor = Mathf.Clamp(floor, 0, 4);

    Vector3 p = transform.position;
    p.y = Mathf.MoveTowards(p.y, floor * floorHeight, moveSpeed * Time.deltaTime);
    transform.position = p;
}

GetKeyDown перемещает платформу на один этаж за одно нажатие, тогда как GetKey добавлял бы этаж каждый кадр, пока клавиша удерживается. Mathf.Clamp не позволяет числу выйти за пределы этажей здания, поэтому нажатие вверх на верхнем этаже ничего не делает, а следующее нажатие вниз сразу перемещает платформу на этаж 3. Mathf.MoveTowards плавно перемещает платформу к нужному этажу со скоростью moveSpeed единиц в секунду и останавливает её точно на нём, вместо того чтобы переместить туда за один кадр. Позиция копируется, изменяется, а затем присваивается обратно, потому что отдельно задать transform.position.y нельзя.

challenge icon

Задание

Средне

Начни создавать Endless Runner с бегуна. В Inspector для Runner задай laneWidth равным 2.5, а laneSpeed равным 15; lane равен -1 для левой полосы, 0 для средней и 1 для правой. В Update() класса Runner:

  • Каждое нажатие стрелки влево или вправо изменяет lane на единицу в соответствующую сторону. Удерживание клавиши всё равно изменяет его только на единицу.
  • lane никогда не становится меньше -1 или больше 1.
  • Бегун плавно перемещается по оси x к lane * laneWidth со скоростью laneSpeed единиц в секунду, сохраняя свои y и z.

Пока оставь остальные три скрипта без изменений. Нажми Play, щёлкни по игровому окну и переключайся между полосами, затем нажми Check.

Попробуйте сами

using UnityEngine;

public class Runner : MonoBehaviour
{
    public float laneWidth = 2.5f;
    public float laneSpeed = 15f;
    private int lane = 0;   // -1 — левая полоса, 0 — средняя, 1 — правая

    void Update()
    {
        // Меняйте полосы с помощью стрелок, затем плавно перемещайтесь к координате x нужной полосы
    }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Создание настоящих игр