Menu
CoddyTech

Сохраняем скорость

Урок 3 из 16 курса Игра в Unity: арканоид на Coddy.

Мяч в Brick Breaker никогда не замедляется. Большую часть работы выполняет его PhysicsMaterial: упругость 1 сохраняет всю скорость после отскока, а трение 0 не даёт стенам замедлять мяч или закручивать его. У стен и кирпичей нет собственного материала, а Unity объединяет значения двух коллайдеров, по умолчанию используя Average: 1 у мяча и стандартное значение 0 у стены дают отскок с половинной скоростью. bounceCombine = Maximum и frictionCombine = Minimum позволяют значениям самого мяча преобладать над значениями объектов, о которые он ударяется.

Физика всё ещё не идеальна: движущаяся платформа добавляет свою скорость к отскоку, два мяча отталкиваются друг от друга, а небольшие погрешности накапливаются за сотни отскоков. Поэтому при каждом FixedUpdate мяч сохраняет своё направление, а его скорость задаётся заново. У Rigidbody мяча также отмечен флажок Freeze Position Z в Inspector, который удерживает его в игровой плоскости.

В другой игре может понадобиться другое правило. Шайба в аэрохоккее может замедляться, но никогда не превышать заданный предел скорости, а Vector3.ClampMagnitude укорачивает слишком длинный вектор и оставляет короткий без изменений:

void FixedUpdate()
{
    rb.linearVelocity = Vector3.ClampMagnitude(rb.linearVelocity, maxSpeed);
}

Для мяча одного ограничения недостаточно: замедлившись до 2 единиц в секунду, он так и останется двигаться со скоростью 2. Его скорость нужно задавать точно, исходя из направления.

challenge icon

Задание

Легко

В Ball:

  1. В Awake() создай new PhysicsMaterial("Bouncy") со значением упругости 1, динамическим и статическим трением 0, установи bounceCombine в Maximum, а frictionCombine — в Minimum, и назначь этот материал коллайдеру мяча с помощью GetComponent<Collider>().material.
  2. Добавь FixedUpdate(): пока мяч запущен, задавай его linearVelocity как текущее направление, умноженное на speed.

В Unity можно также создать материал как ресурс (Create > Physics Material) и перетащить его в слот Material компонента Sphere Collider; здесь материал создаётся скриптом.

Нажми Play, запусти мяч и посмотри, как он отскакивает, затем нажми Check.

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

using UnityEngine;
using UnityEngine.InputSystem;

public class Ball : MonoBehaviour
{
    public Transform paddle;
    public float speed = 9f;

    Rigidbody rb;
    bool launched;

    void Awake()
    {
        rb = GetComponent<Rigidbody>();
    }

    void Update()
    {
        if (launched) return;
        transform.position = paddle.position + Vector3.up * 0.5f;
        if (Keyboard.current.spaceKey.wasPressedThisFrame) Launch(new Vector3(0.3f, 1f, 0f));
    }

    public void Launch(Vector3 direction)
    {
        launched = true;
        rb.linearVelocity = direction.normalized * speed;
    }
}
quiz iconПроверьте себя

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

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