Menu
CoddyTech

Mantieni la velocità

Lezione 3 di 19 del corso Gioco in Unity: Rompi i mattoni di Coddy.

La pallina di Brick Breaker non rallenta mai. Il suo PhysicsMaterial fa gran parte del lavoro: un rimbalzo pari a 1 mantiene tutta la velocità del rimbalzo e un attrito pari a 0 impedisce alle pareti di frenarla. Le pareti non hanno un materiale e Unity calcola per impostazione predefinita la media dei valori dei due collider: il valore 1 della pallina e il valore 0 di una parete fanno sì che la pallina rimbalzi a metà velocità. bounceCombine = Maximum e frictionCombine = Minimum fanno sì che prevalgano i valori della pallina.

La fisica non è ancora perfetta: una racchetta in movimento aggiunge la propria velocità e piccoli errori si accumulano nel corso di centinaia di rimbalzi. Quindi, a ogni passaggio della fisica, la pallina mantiene la propria direzione e la sua velocità viene reimpostata:

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

Una pallina rallentata a 2 unità al secondo torna a viaggiare a 7 al passaggio successivo.

challenge icon

Sfida

Facile

Fai rimbalzare la palla all'infinito a una velocità costante.

  1. In Ball, nel metodo Awake(), crea new PhysicsMaterial("Bouncy") con rimbalzo pari a 1 ed entrambi gli attriti pari a 0; imposta bounceCombine = PhysicsMaterialCombine.Maximum e frictionCombine = PhysicsMaterialCombine.Minimum; assegnalo a GetComponent<Collider>().material.
  2. Aggiungi FixedUpdate(): se la palla è stata lanciata, rb.linearVelocity = rb.linearVelocity.normalized * speed;

Premi «Gioca» e lancia la palla: rimbalzerà contro ogni parete senza rallentare. Poi premi «Verifica».

Provalo tu

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;
    }
}

Tutte le lezioni di Gioco in Unity: Rompi i mattoni

Esercitati da solo: Playground Unity