Menu
CoddyTech

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

challenge icon

Sfida

Medio

Scrivi un helper generico per le casse e le lampade della torre d’urto.

  1. In Helpers.cs, scrivi la classe statica Helpers con InRange<T>(IEnumerable<T> items, Vector3 center, float range) pubblico per i componenti: una List<T> degli elementi che si trovano a una distanza massima di range.
  2. In Pulse, quando premi Spazio, applica un impulso verso l’alto di lift a ogni Rigidbody nel raggio.
  3. 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

Esercitati da solo: Playground Unity