Сохраняем скорость
Урок 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. Его скорость нужно задавать точно, исходя из направления.
Задание
ЛегкоВ Ball:
- В
Awake()создайnew PhysicsMaterial("Bouncy")со значением упругости 1, динамическим и статическим трением 0, установиbounceCombineв Maximum, аfrictionCombine— в Minimum, и назначь этот материал коллайдеру мяча с помощьюGetComponent<Collider>().material. - Добавь
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;
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.