Menu
CoddyTech

Платформа

Урок 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 — это высота машины, а чтение этого значения на каждом шаге позволяет правильно задавать предел, даже если размер меняется во время игры.

challenge icon

Задание

Легко

Напиши перемещение ракетки в FixedUpdate() класса Paddle:

  1. Создай float input: -1, пока удерживается клавиша со стрелкой влево или A, 1, пока удерживается клавиша со стрелкой вправо или D, иначе 0.
  2. Вычисли целевую позицию: позиция Rigidbody, смещённая вправо на input * speed * Time.fixedDeltaTime.
  3. Ограничь координату x цели так, чтобы края ракетки останавливались у внутренних поверхностей стен: -wallX и wallX. Ширина ракетки — transform.localScale.x.
  4. Перемести её туда с помощью 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 и оставайтесь между стенами.
    }
}
quiz iconПроверьте себя

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

Все уроки раздела Игра в Unity: арканоид