Три полосы
Часть раздела Создание настоящих игр путешествия по 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 нельзя.
Задание
СреднеНачни создавать 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 нужной полосы
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Создание настоящих игр
1Текст на экране
Холст и текстПокажем счётФорматирование чиселТаймер обратного отсчётаПовторение: спидометр4Сцены и уровни
Загрузить сценуПерезапустить уровеньСледующий уровеньСохранить между сценамиПовторение: выбор уровня7Управление временем
Пауза с timeScaleЗамедленное движениеНемасштабируемое времяПовторение: Bullet Time10Проект: 3D-платформер
ТрассаДвижущиеся платформы2Кнопки и экраны
Кнопки и onClickЛямбдыСвязи в InspectorВключение и выключение панелейШкалы здоровьяПовторение: магазин улучшений5Сохранение с помощью PlayerPrefs
Сохранение числаЗагрузка со значением по умолчаниюРекордСохранение настроекПовторение: монеты в банке3Менеджер игры
Один скрипт управляет игройОдиночкаСостояния игрыПереключение состоянияПовторение: менеджер раундов6Проект: бесконечный раннер
Три полосыПрепятствия впереди