Menu
CoddyTech

Mantieni la velocità

Lezione 3 di 16 del corso Gioco Unity: Rompi-mattoni di Coddy.

Una pallina di Brick Breaker non rallenta mai. Il suo PhysicsMaterial fa gran parte del lavoro: bounciness 1 mantiene tutta la velocità di un rimbalzo e friction 0 impedisce alle pareti di trascinare o far girare la pallina. Le pareti e i mattoni non hanno un materiale proprio e Unity combina i valori dei due collider, per impostazione predefinita usando Average: l'1 della pallina e lo 0 predefinito di una parete fanno sì che il rimbalzo avvenga a metà velocità. bounceCombine = Maximum e frictionCombine = Minimum fanno prevalere i valori della pallina su quelli di qualsiasi cosa colpisca.

La fisica non è comunque esatta: una racchetta in movimento aggiunge la propria velocità a un rimbalzo, due palline si spingono a vicenda e piccoli errori si accumulano nel corso di centinaia di rimbalzi. Perciò, a ogni FixedUpdate, la pallina mantiene la propria direzione e la sua velocità viene reimpostata. Nel Rigidbody della pallina è selezionata anche l'opzione Freeze Position Z nell'Inspector, che la mantiene sul piano di gioco.

Un gioco diverso richiede una regola diversa. Un disco da air hockey può rallentare, ma non superare mai un limite di velocità, e Vector3.ClampMagnitude accorcia un vettore troppo lungo e lascia invariato uno più corto:

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

Per la pallina, un limite non basta: se rallentasse fino a 2 unità al secondo, resterebbe a 2. La sua velocità deve essere impostata esattamente, a partire dalla sua direzione.

challenge icon

Sfida

Facile

In Ball:

  1. In Awake(), crea un new PhysicsMaterial("Bouncy") con rimbalzo pari a 1, attrito dinamico e statico pari a 0, bounceCombine impostato su Maximum e frictionCombine impostato su Minimum, quindi assegnalo al collider della pallina con GetComponent<Collider>().material.
  2. Aggiungi FixedUpdate(): mentre la pallina è stata lanciata, imposta la sua linearVelocity sulla direzione attuale moltiplicata per speed.

In Unity puoi anche creare il materiale come risorsa (Create > Physics Material) e trascinarlo nello slot Material dello Sphere Collider; qui lo crea lo script.

Premi Play, lancia la pallina e guardala rimbalzare, poi premi Check.

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;
    }
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Gioco Unity: Rompi-mattoni