Платформа
Урок 1 из 16 курса Игра в Unity: арканоид на Coddy.
В этом курсе ты создашь Brick Breaker в 3D: платформу внизу, мяч, который отскакивает от стен, и стену из кирпичей, которые нужно разбить. В каждом уроке добавляется одна функция: кирпичи, жизни, уровни, экран завершения игры и усиления, которые расширяют платформу или разделяют мяч. Сцена готова: камера смотрит на игровое поле спереди, и всё движется в плоскости x и y при z = 0. Скрипты Paddle, Ball, Brick, GameManager и PowerUp пока представляют собой короткие заготовки.
У платформы есть кинематическое тело Rigidbody, которое перемещается с помощью MovePosition в FixedUpdate, поэтому физика видит его движение, и позже мяч сможет отскакивать от него. Кинематическое тело никогда не останавливается коллайдерами без Rigidbody, поэтому боковые стены не будут его сдерживать: скрипт удерживает платформу внутри игрового поля. Если ограничить центр на уровне стены, половина объекта окажется внутри стены, поэтому предел — это положение стены минус половина размера объекта. Лифт в шахте от y = 0 до y = 12 делает это по оси y:
float halfHeight = transform.localScale.y / 2f;
Vector3 target = rb.position + Vector3.up * input * liftSpeed * Time.fixedDeltaTime;
target.y = Mathf.Clamp(target.y, 0f + halfHeight, 12f - halfHeight);
rb.MovePosition(target);Здесь input равен 1 при движении вверх, -1 при движении вниз и 0 в остальных случаях. У машины высотой 2 единицы центр остаётся в диапазоне от 1 до 11, поэтому её края останавливаются точно на отметках 0 и 12. Примитив Cube имеет длину каждой стороны 1 единицу, поэтому localScale.y — это высота машины, а чтение этого значения на каждом шаге позволяет правильно задавать предел, даже если размер меняется во время игры.
Задание
ЛегкоНапиши перемещение ракетки в FixedUpdate() класса Paddle:
- Создай
float input: -1, пока удерживается клавиша со стрелкой влево или A, 1, пока удерживается клавиша со стрелкой вправо или D, иначе 0. - Вычисли целевую позицию: позиция Rigidbody, смещённая вправо на
input * speed * Time.fixedDeltaTime. - Ограничь координату x цели так, чтобы края ракетки останавливались у внутренних поверхностей стен:
-wallXиwallX. Ширина ракетки —transform.localScale.x. - Перемести её туда с помощью
rb.MovePosition.
Нажми Play, придвинь ракетку к обеим стенам, затем нажми Check.
Попробуйте сами
using UnityEngine;
using UnityEngine.InputSystem;
public class Paddle : MonoBehaviour
{
public float speed = 14f;
public float wallX = 8f; // Внутренние поверхности боковых стен находятся на координатах -wallX и wallX
Rigidbody rb;
void Awake()
{
rb = GetComponent<Rigidbody>();
}
void FixedUpdate()
{
// Двигайтесь с помощью клавиш со стрелками или A и D и оставайтесь между стенами.
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.