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.
Sfida
MedioAggiungi due metodi di estensione al gufo.
- In
FlatExtensions, aggiungiFlatDistance(this Vector3 a, Vector3 b)come metodo statico pubblico: la distanza senza considerare l'altezza,5da (0, 5, 0) a (3, 0, 4). - Allo stesso modo,
FaceFlat(this Transform t, Vector3 target)ruotatsolo attorno all'asse y. - In
Owl, fai orientare il gufo verso il giocatore con FaceFlat;eyessono accesi quando FlatDistance è inferiore asight.
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
1Componenti, non gerarchie
Componenti piccoliUno script base per i nemiciComponenti astrattiComponenti che collaboranoRipasso: torretta modulareRipasso: cannone doppio4Dati serializzati
Classi serializzabiliElenchi nell'InspectorEnum nell'InspectorRiepilogo: tabella del bottinoRiepilogo: tira il bottino2Interfacce in Unity
IDamageableInterfacce e TryGetComponentGetComponentsRiepilogo: tasto InteragisciRiepilogo: il più vicino a portata5ScriptableObjects
Asset di datiStatistiche delle armiImpostazioni condiviseSalva il ventoOnde come datiRiepilogo: database degli oggettiRiepilogo: comprare dal negozio8Codice riutilizzabile
Metodi di estensioneUn singleton genericoFunzioni di supporto genericheRipasso: FindNearestEsercitati da solo: Playground Unity