Menu
CoddyTech

Componenti piccoli

Fa parte della sezione Architettura dei giochi in Unity del percorso Unity di Coddy. Lezione 1 di 64.

Un GameObject è un elenco di componenti e ogni script che scrivi è uno di questi. I giochi Unity si costruiscono assegnando a ogni script un compito e inserendo più script su un oggetto. Il movimento, gli spari e i punti vita di un giocatore potrebbero essere tutti gestiti da un unico PlayerController, ma, come tre componenti, Mover, Shooter e Health possono essere assegnati anche ad altri oggetti:

public class Health : MonoBehaviour
{
    public int hp = 3;

    public void TakeDamage(int amount)
    {
        hp -= amount;
        if (hp <= 0)
        {
            Destroy(gameObject);
        }
    }
}
  • Giocatore: Mover, Shooter, Health
  • Torretta: Shooter, Health
  • Cassa: Health

Con le normali classi C# potresti invece creare una gerarchia: Character, poi ShootingCharacter : Character, poi Player : ShootingCharacter. Una torretta spara ma non cammina mai e una cassa si rompe soltanto, quindi ogni nuovo tipo di oggetto richiede di ristrutturare la gerarchia. Con i componenti, un nuovo tipo di oggetto è una nuova combinazione di script già esistenti, assemblati nell'Inspector, e ogni script può avere lì i propri valori: un Mover lento su un oggetto, uno veloce su un altro.

I componenti di uno stesso oggetto condividono il suo Transform, quindi ciascuno dovrebbe modificare solo la parte di cui è responsabile. Un Mover che aggiunge valori a x e z con transform.position += lascia invariato y, così un Jumper sullo stesso oggetto può comunque modificare l'altezza. Un Mover che impostasse l'intera posizione su new Vector3(x, 0.5f, z) riporterebbe y al valore iniziale a ogni fotogramma, annullando il salto.

challenge icon

Sfida

Facile

Suddividi Boat.cs in modo che ogni script svolga un solo compito.

  1. Sposta il movimento su e giù in Bobber: startY impostato in Start(), il movimento su e giù in Update(), usando i propri height e speed.
  2. Sposta il lampeggiamento in Blinker, con il proprio timer.
  3. Elimina entrambi i compiti e i relativi campi da Boat, così che si occupi solo di guidare.

Premi «Gioca»: l'anatra si muove su e giù, la boa lampeggia e la barca viene guidata. Poi premi «Verifica».

Provalo tu

using UnityEngine;
using UnityEngine.InputSystem;

// Uno script, tre compiti: sterzare, ondeggiare e lampeggiare.
public class Boat : MonoBehaviour
{
    public float speed = 3f;
    public float bobHeight = 0.1f;
    public float bobSpeed = 2f;
    public Renderer lamp;
    public float blinkInterval = 0.5f;

    private InputAction moveAction;
    private float startY;
    private float blinkTimer;

    void Start()
    {
        moveAction = InputSystem.actions.FindAction("Move");
        startY = transform.position.y;
    }

    void Update()
    {
        // sterzare
        Vector2 input = moveAction.ReadValue<Vector2>();
        transform.position += new Vector3(input.x, 0f, input.y) * speed * Time.deltaTime;

        // ondeggiare
        Vector3 p = transform.position;
        p.y = startY + Mathf.Sin(Time.time * bobSpeed) * bobHeight;
        transform.position = p;

        // lampeggiare
        blinkTimer += Time.deltaTime;
        if (blinkTimer >= blinkInterval)
        {
            blinkTimer -= blinkInterval;
            lamp.enabled = !lamp.enabled;
        }
    }
}

Tutte le lezioni di Architettura dei giochi in Unity

Esercitati da solo: Playground Unity