Menu
CoddyTech

Metodi di estensione

Fa parte della sezione Architettura dei giochi in Unity del percorso Unity di Coddy. Lezione 33 di 50.

Vector3 e Transform appartengono a Unity, quindi non puoi aggiungere un metodo a questi tipi. Un metodo di estensione è un metodo static che C# ti permette di chiamare come se fosse un loro metodo. Questi due fanno risparmiare righe che ricorrono in ogni progetto:

public static class UnityExtensions
{
    public static Vector3 WithY(this Vector3 v, float y)
    {
        return new Vector3(v.x, y, v.z);
    }

    public static void DestroyChildren(this Transform parent)
    {
        foreach (Transform child in parent)
        {
            Object.Destroy(child.gameObject);
        }
    }
}
// in qualsiasi script
transform.position = transform.position.WithY(0.5f);
inventoryPanel.DestroyChildren();

Per creare un metodo di estensione servono tre cose: una classe static che non sia annidata né generica, un metodo static e this prima del primo parametro. Quel parametro è il valore a sinistra del punto, quindi transform.position.WithY(0.5f) viene compilato come UnityExtensions.WithY(transform.position, 0.5f). Vector3 è una struct, quindi v è una copia: WithY non può modificare il vettore del chiamante e ne restituisce invece uno nuovo. È anche così che si aggira transform.position.y = 0.5f;, che non viene compilato.

La classe static non è un MonoBehaviour. Si trova in un file .cs dedicato, che può avere qualsiasi nome, e non va mai aggiunta a un oggetto. I metodi ereditati da un MonoBehaviour, come Destroy, qui richiedono di specificare la classe: Object.Destroy. È sicuro distruggere i figli all'interno del foreach, perché Unity li rimuove solo alla fine del frame.

challenge icon

Sfida

Medio

Un gufo appollaiato su un alto palo osserva il cortile. Le frecce controllano il Player (già pronto). Aggiungi al progetto due metodi di estensione e usali nel gufo:

  • In FlatExtensions.cs, scrivi una classe statica FlatExtensions.
  • FlatDistance estende Vector3: a.FlatDistance(b) restituisce la distanza da a a b sul terreno, ignorando la differenza di altezza. Da (0, 5, 0) a (3, 0, 4) è 5.
  • FaceFlat estende Transform: t.FaceFlat(target) fa ruotare t per rivolgersi verso il target solo attorno all'asse y, così resta eretto indipendentemente dall'altezza del target.
  • In Owl.cs, a ogni fotogramma il gufo si rivolge verso il giocatore con FaceFlat e i suoi eyes sono accesi quando il giocatore è più vicino di sight (3) sul terreno, e spenti altrimenti. Il gufo è appollaiato in alto sul palo, quindi non usare Vector3.Distance.

Premi Play, cammina intorno al palo e sotto il gufo, poi premi Check.

Provalo tu

using UnityEngine;

// FlatExtensions: FlatDistance e FaceFlat
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 Architettura dei giochi in Unity