Menu
CoddyTech

Funciones auxiliares genéricas

Parte de la sección Arquitectura de juegos en Unity del Journey de Unity de Coddy. Lección 44 de 64.

Algunos métodos auxiliares son iguales para todos los tipos: obtener un componente o añadirlo, elegir una entrada aleatoria de una matriz. Un método genérico los escribe una sola vez, con el tipo como parámetro T que cada llamada completa:

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 es una garantía sobre T, y determina qué puede hacer el método con él. AddComponent solo acepta componentes, así que, sin la restricción, el compilador rechaza go.AddComponent<T>(); con ella, cualquier componente funciona, ya sea el Rigidbody de Unity o tus propios scripts. La restricción también te da acceso a todos los miembros de Component en un T, como .transform y .gameObject. Si una caja ya tiene un Rigidbody, se obtiene ese mismo y no se añade nada.

RandomItem no tiene ninguna restricción, porque nunca accede a T: funciona por igual con colores, cadenas de texto y prefabs. Rara vez escribes el tipo en la llamada: a partir de colors, que es un Color[], el compilador deduce que T es Color. Un método que acepta IEnumerable<T> en lugar de T[] acepta tanto matrices como Lists, incluidas las matrices que devuelve FindObjectsByType<T>.

challenge icon

Desafío

Intermedio

Escribe un ayudante genérico para las cajas y las lámparas de la torre de choque.

  1. En Helpers.cs, escribe la clase estática Helpers con InRange<T>(IEnumerable<T> items, Vector3 center, float range) público para componentes: una List<T> de los elementos que estén como máximo a range de distancia.
  2. En Pulse, al pulsar la barra espaciadora, aplica un impulso hacia arriba de lift a cada Rigidbody que esté dentro del rango.
  3. Después, llama a TurnOn() en cada Lamp que esté dentro del rango.

Pulsa «Jugar» y pulsa la barra espaciadora: la caja cercana salta. Después, «Comprobar».

Pruébalo tú mismo

using System.Collections.Generic;
using UnityEngine;

// Helpers.InRange<T>: los elementos dentro del alcance de un punto

Todas las lecciones de Arquitectura de juegos en Unity

Practica por tu cuenta: Playground de Unity