Funzioni di supporto generiche
Fa parte della sezione Architettura dei giochi in Unity del percorso Unity di Coddy. Lezione 44 di 64.
Alcuni helper sono uguali per ogni tipo: ottenere un componente oppure aggiungerlo, scegliere un elemento casuale da un array. Un metodo generico li definisce una sola volta, usando 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 può fare il metodo con esso. AddComponent accetta solo componenti, quindi senza il vincolo il compilatore rifiuta go.AddComponent<T>(); con il vincolo, funziona con qualsiasi componente, sia il Rigidbody di Unity sia i tuoi script. Il vincolo ti dà anche accesso a ogni membro di Component su un T, come .transform e .gameObject. Se una cassa ha già un Rigidbody, ottieni quello e non ne viene aggiunto nessuno.
RandomItem non ha vincoli, perché non interagisce mai con T: funziona allo stesso modo con colori, stringhe e prefab. Raramente specifichi il tipo nella chiamata: a partire da colors, un Color[], il compilatore deduce che T è Color. Un metodo che accetta IEnumerable<T> invece di T[] accetta sia gli array sia le Lists, compresi gli array restituiti da FindObjectsByType<T>.
Sfida
MedioScrivi un helper generico per le casse e le lampade della torre d’urto.
- In
Helpers.cs, scrivi la classe staticaHelpersconInRange<T>(IEnumerable<T> items, Vector3 center, float range)pubblico per i componenti: unaList<T>degli elementi che si trovano a una distanza massima dirange. - In
Pulse, quando premi Spazio, applica un impulso verso l’alto dilifta ogni Rigidbody nel raggio. - Poi chiama
TurnOn()su ogni Lamp nel raggio.
Premi «Gioca» e premi Spazio: la cassa vicina salta. Poi premi «Verifica».
Provalo tu
using System.Collections.Generic;
using UnityEngine;
// Helpers.InRange<T>: gli elementi entro una certa distanza da un punto
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