Сохраняем скорость
Урок 3 из 19 курса Игра в Unity: арканоид на Coddy.
Мяч в Brick Breaker никогда не замедляется. Большую часть работы выполняет его PhysicsMaterial: упругость 1 сохраняет всю скорость при отскоке, а трение 0 не даёт стенам тормозить мяч. У стен нет материала, и Unity по умолчанию усредняет значения двух коллайдеров: значение мяча 1 и значение стены 0 дают отскок с половинной скоростью. Параметры bounceCombine = Maximum и frictionCombine = Minimum позволяют использовать собственные значения мяча.
Физика всё ещё не идеальна: движущаяся ракетка добавляет свою скорость, а небольшие погрешности накапливаются за сотни отскоков. Поэтому на каждом физическом шаге направление мяча сохраняется, а его скорость сбрасывается до исходной:
rb.linearVelocity = rb.linearVelocity.normalized * 7f;Мяч, замедлившийся до 2 единиц в секунду, уже на следующем шаге снова полетит со скоростью 7.
Задание
ЛегкоМяч должен бесконечно отскакивать с постоянной скоростью.
- В
Awake()классаBallсоздайnew PhysicsMaterial("Bouncy")с упругостью 1, обоими коэффициентами трения 0,bounceCombine = PhysicsMaterialCombine.MaximumиfrictionCombine = PhysicsMaterialCombine.Minimum; установи его вGetComponent<Collider>().material. - Добавь
FixedUpdate(): если мяч запущен,rb.linearVelocity = rb.linearVelocity.normalized * speed;
Нажми «Играть» и запусти мяч: он будет отскакивать от каждой стены, не замедляясь. Затем нажми «Проверить».
Попробуйте сами
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;
}
}
Все уроки раздела Игра в Unity: арканоид
Потренируйтесь самостоятельно: Песочница Unity