Menu
CoddyTech

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

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

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

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

rb.linearVelocity = rb.linearVelocity.normalized * 7f;

Мяч, замедлившийся до 2 единиц в секунду, уже на следующем шаге снова полетит со скоростью 7.

challenge icon

Задание

Легко

Мяч должен бесконечно отскакивать с постоянной скоростью.

  1. В Awake() класса Ball создай new PhysicsMaterial("Bouncy") с упругостью 1, обоими коэффициентами трения 0, bounceCombine = PhysicsMaterialCombine.Maximum и frictionCombine = PhysicsMaterialCombine.Minimum; установи его в GetComponent<Collider>().material.
  2. Добавь 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