La racchetta
Lezione 1 di 16 del corso Gioco Unity: Rompi-mattoni di Coddy.
In questo corso costruirai Brick Breaker in 3D: una racchetta in basso, una palla che rimbalza tra le pareti e un muro di mattoni da rompere. Ogni lezione aggiunge una funzionalità: i mattoni, le vite, i livelli, una schermata di fine partita e i potenziamenti che allargano la racchetta o dividono la palla. La scena è pronta: la telecamera inquadra il campo di gioco frontalmente e tutto si muove sul piano x e y a z = 0. Per ora gli script Paddle, Ball, Brick, GameManager e PowerUp sono brevi stub.
La racchetta ha un Rigidbody cinematico, spostato con MovePosition in FixedUpdate, così la fisica ne rileva il movimento e i rimbalzi della palla potranno sfruttarlo in seguito. Un corpo cinematico non viene mai fermato dai collider privi di Rigidbody, quindi le pareti laterali non lo bloccheranno: ci pensa lo script a mantenerlo al suo posto. Limitare il centro in corrispondenza della parete lascerebbe metà dell'oggetto dentro la parete, quindi il limite è la posizione della parete meno metà delle dimensioni dell'oggetto. Questo ascensore in un pozzo che va da y = 0 a y = 12 lo fa sull'asse y:
float halfHeight = transform.localScale.y / 2f;
Vector3 target = rb.position + Vector3.up * input * liftSpeed * Time.fixedDeltaTime;
target.y = Mathf.Clamp(target.y, 0f + halfHeight, 12f - halfHeight);
rb.MovePosition(target);Qui input è 1 per salire, -1 per scendere e 0 negli altri casi. Un ascensore alto 2 unità mantiene il centro tra 1 e 11, così le sue estremità si fermano esattamente a 0 e 12. Un primitivo Cube misura 1 unità per lato, quindi localScale.y è l'altezza dell'ascensore; leggerlo a ogni passaggio mantiene corretto il limite anche se le dimensioni cambiano durante il gioco.
Sfida
FacileScrivi il movimento della racchetta in FixedUpdate() di Paddle:
- Crea un
float input: -1 mentre tieni premuta la freccia sinistra o A, 1 mentre tieni premuta la freccia destra o D, 0 altrimenti. - Calcola il bersaglio: la posizione del Rigidbody spostata verso destra di
input * speed * Time.fixedDeltaTime. - Limita la x del bersaglio in modo che le estremità della racchetta si fermino sulle facce interne delle pareti,
-wallXewallX. La larghezza della racchetta ètransform.localScale.x. - Spostala lì con
rb.MovePosition.
Premi Play, sposta la racchetta contro entrambe le pareti, poi premi Check.
Provalo tu
using UnityEngine;
using UnityEngine.InputSystem;
public class Paddle : MonoBehaviour
{
public float speed = 14f;
public float wallX = 8f; // le facce interne delle pareti laterali si trovano a -wallX e wallX
Rigidbody rb;
void Awake()
{
rb = GetComponent<Rigidbody>();
}
void FixedUpdate()
{
// Muoviti con i tasti freccia oppure con A e D, e rimani tra le pareti.
}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.