Funzioni di supporto generiche
Fa parte della sezione Architettura dei giochi in Unity del percorso Unity di Coddy. Lezione 35 di 50.
Alcuni helper sono uguali per ogni tipo: ottenere un componente o aggiungerlo, scegliere un elemento casuale da un array. Un metodo generico li definisce una sola volta, con il tipo come parametro T che ogni chiamata specifica:
public static class Helpers
{
public static T GetOrAdd<T>(this GameObject go) where T : Component
{
if (!go.TryGetComponent(out T found)) found = go.AddComponent<T>();
return found;
}
public static T RandomItem<T>(T[] items)
{
return items[Random.Range(0, items.Length)];
}
}Rigidbody body = crate.GetOrAdd<Rigidbody>();
Color paint = Helpers.RandomItem(colors);
GameObject enemy = Helpers.RandomItem(enemyPrefabs);where T : Component è una garanzia su T e determina cosa il metodo può fare con esso. AddComponent accetta solo componenti, quindi senza il vincolo il compilatore rifiuta go.AddComponent<T>(); con il vincolo, funziona con qualsiasi componente, il Rigidbody di Unity o i tuoi script. Il vincolo ti dà anche accesso a ogni membro di Component su un T, come .transform e .gameObject. Se un crate ha già un Rigidbody, viene restituito quello e non viene aggiunto nulla.
RandomItem non ha vincoli, perché non interagisce mai con T: funziona con colori, stringhe e prefab allo stesso modo. Di rado specifichi il tipo nella chiamata: da colors, un Color[], il compilatore deduce che T è Color. Un metodo che accetta IEnumerable<T> invece di T[] accetta sia array sia List, compresi gli array restituiti da FindObjectsByType<T>.
Sfida
MedioNel cortile c'è una torre d'urto. Quando premi Spazio, emette un impulso: le casse entro una distanza di 4 vengono scagliate in aria e le lampade entro 4 si accendono. Lamp.cs è pronto, con TurnOn(). Scrivi un helper che trovi entrambi:
- In
Helpers.cs, scrivi una classe staticaHelperscon un metodo genericoInRange<T>(IEnumerable<T> items, Vector3 center, float range)per qualsiasi tipo di componente. Restituisce unaList<T>degli elementi la cui posizione si trova a una distanza al massimo pari arangedacenter. - In
Pulse.cs, quando premi Spazio: ogni Rigidbody nella scena entrorangedalla torre riceve un impulso verso l'alto dilift, e ogni Lamp entrorangesi accende. Usa InRange per entrambi, sugli array che ti fornisceFindObjectsByType.
Premi Play, premi Spazio, poi Check.
Provalo tu
using System.Collections.Generic;
using UnityEngine;
// Helpers.InRange<T>: gli elementi entro il raggio di un punto
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