Три полосы
Часть раздела Создание настоящих игр путешествия по 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.
Задание
СреднеСделай так, чтобы стрелки перемещали бегуна между тремя полосами.
- В
Runner, внутриUpdate(), выполняйlane--при нажатииInput.GetKeyDown(KeyCode.LeftArrow), а при нажатии стрелки вправо —lane++. - Не позволяй бегуну съехать с дороги:
lane = Mathf.Clamp(lane, -1, 1);. - Скопируй
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 выбранной полосы
}
}
Все уроки раздела Создание настоящих игр
1Текст на экране
Холст и текстПокажем счётФорматирование чиселТаймер обратного отсчётаПовторение: спидометр4Сцены и уровни
Загрузить сценуПерезапустить уровеньСледующий уровеньСохранить между сценамиПовторение: выбор уровня2Кнопки и экраны
Кнопки и onClickЛямбдыСвязи в InspectorВключение и выключение панелейШкалы здоровьяПовторение: магазин улучшений5Сохранение с помощью PlayerPrefs
Сохранение числаЗагрузка со значением по умолчаниюРекордСохранение настроекПовторение: монеты в банке3Менеджер игры
Один скрипт управляет игройОдиночкаСостояния игрыПереключение состоянияПовторение: менеджер раундов6Проект: Бесконечный раннер
Три полосыПрепятствия впередиПотренируйтесь самостоятельно: Песочница Unity