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.
Sfida
MedioUn 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 staticaFlatExtensions. FlatDistanceestende Vector3:a.FlatDistance(b)restituisce la distanza daaabsul terreno, ignorando la differenza di altezza. Da (0, 5, 0) a (3, 0, 4) è 5.FaceFlatestende Transform:t.FaceFlat(target)fa ruotaretper 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 suoieyessono accesi quando il giocatore è più vicino disight(3) sul terreno, e spenti altrimenti. Il gufo è appollaiato in alto sul palo, quindi non usareVector3.Distance.
Premi Play, cammina intorno al palo e sotto il gufo, poi premi Check.
Provalo tu
using UnityEngine;
// FlatExtensions: FlatDistance e FaceFlat
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
1Componenti, non gerarchie
Componenti piccoliUno script base per i nemiciComponenti astrattiComponenti che collaboranoRiepilogo: torretta modulare4Dati serializzati
Classi serializzabiliListe nell'InspectorEnum nell'InspectorRiepilogo: tabella del bottino7Macchine a stati
Gli stati come classiUna macchina a statiTransizioniIntelligenze dei nemiciRiepilogo: stati della porta10Progetto: Sopravvissuto nell’arena
L’eroeTipi di nemici5ScriptableObjects
Asset di datiStatistiche delle armiImpostazioni condiviseOndate come datiRiepilogo: database degli oggetti8Codice riutilizzabile
Metodi di estensioneUn singleton genericoFunzioni di supporto genericheRipasso: FindNearest