Menu
CoddyTech

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>.

challenge icon

Sfida

Medio

Nel 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 statica Helpers con un metodo generico InRange<T>(IEnumerable<T> items, Vector3 center, float range) per qualsiasi tipo di componente. Restituisce una List<T> degli elementi la cui posizione si trova a una distanza al massimo pari a range da center.
  • In Pulse.cs, quando premi Spazio: ogni Rigidbody nella scena entro range dalla torre riceve un impulso verso l'alto di lift, e ogni Lamp entro range si accende. Usa InRange per entrambi, sugli array che ti fornisce FindObjectsByType.

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
quiz iconMettiti alla prova

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