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.
Sfida
FacileIn Ball:
- In
Awake(), crea unnew PhysicsMaterial("Bouncy")con rimbalzo pari a 1, attrito dinamico e statico pari a 0,bounceCombineimpostato su Maximum efrictionCombineimpostato su Minimum, quindi assegnalo al collider della pallina conGetComponent<Collider>().material. - Aggiungi
FixedUpdate(): mentre la pallina è stata lanciata, imposta la sualinearVelocitysulla direzione attuale moltiplicata perspeed.
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;
}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.