Menu
CoddyTech

Metodi di estensione

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

Vector3 e Transform appartengono a Unity, quindi non puoi aggiungere un metodo a questi tipi. Un metodo di estensione è un metodo statico che C# ti permette di chiamare come se appartenesse a loro. Questi due metodi fanno risparmiare righe che si ripetono 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();

Un metodo di estensione ha tre caratteristiche: una classe statica che non è né annidata né generica, un metodo statico 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 aggira transform.position.y = 0.5f;, che non viene compilato.

La classe statica non è un MonoBehaviour. Si trova in un file .cs tutto suo, che può avere qualsiasi nome, e non viene mai aggiunta a un oggetto. I metodi ereditati da un MonoBehaviour, come Destroy, richiedono che qui si indichi la loro classe: Object.Destroy. Distruggere i figli all'interno del foreach è sicuro, perché Unity li rimuove solo alla fine del frame.

challenge icon

Sfida

Medio

Aggiungi due metodi di estensione al gufo.

  1. In FlatExtensions, aggiungi FlatDistance(this Vector3 a, Vector3 b) come metodo statico pubblico: la distanza senza considerare l'altezza, 5 da (0, 5, 0) a (3, 0, 4).
  2. Allo stesso modo, FaceFlat(this Transform t, Vector3 target) ruota t solo attorno all'asse y.
  3. In Owl, fai orientare il gufo verso il giocatore con FaceFlat; eyes sono accesi quando FlatDistance è inferiore a sight.

Premi «Gioca» e cammina sotto il gufo: i suoi occhi si illuminano. Poi premi «Verifica».

Provalo tu

using UnityEngine;

public static class FlatExtensions
{
    // FlatDistance (Vector3) e FaceFlat (Transform) vanno qui
}

Tutte le lezioni di Architettura dei giochi in Unity

Esercitati da solo: Playground Unity