Menu
CoddyTech

Три полосы

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

В этой главе мы создадим бесконечный раннер. Персонаж бежит по дороге с тремя полосами и переключается между ними, чтобы уклоняться от приближающихся препятствий. В следующих уроках дорога будет ускоряться, на экране будет отображаться пройденное расстояние, столкновение будет завершать забег с кнопкой для повторного запуска, а лучший результат будет сохраняться. Персонаж никогда не движется вперёд: он остаётся на 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

Задание

Средне

Сделай так, чтобы стрелки перемещали бегуна между тремя полосами.

  1. В Runner, внутри Update(), выполняй lane-- при нажатии Input.GetKeyDown(KeyCode.LeftArrow), а при нажатии стрелки вправо — lane++.
  2. Не позволяй бегуну съехать с дороги: lane = Mathf.Clamp(lane, -1, 1);.
  3. Скопируй transform.position в p, перемести p.x в направлении lane * laneWidth с помощью Mathf.MoveTowards со скоростью laneSpeed * Time.deltaTime, затем присвой p обратно.

Нажми «Играть», щёлкни по игровому окну и переключай полосы: бегун будет скользить по дороге. Затем нажми «Проверить».

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

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 выбранной полосы
    }
}

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

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