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>.
Desafío
IntermedioEscribe un ayudante genérico para las cajas y las lámparas de la torre de choque.
- En
Helpers.cs, escribe la clase estáticaHelpersconInRange<T>(IEnumerable<T> items, Vector3 center, float range)público para componentes: unaList<T>de los elementos que estén como máximo arangede distancia. - En
Pulse, al pulsar la barra espaciadora, aplica un impulso hacia arriba delifta cada Rigidbody que esté dentro del rango. - 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
1Componentes, no jerarquías
Componentes pequeñosUn script base para enemigosComponentes abstractosComponentes que trabajan juntosRepaso: torreta modularRepaso: cañón doble4Datos serializados
Clases serializablesListas en el InspectorEnumeraciones en el InspectorRepaso: tabla de botínRepaso: sortear el botín2Interfaces en Unity
IDamageableInterfaces y TryGetComponentGetComponentsRepaso: Tecla de interacciónRepaso: El más cercano al alcance5ScriptableObjects
Activos de datosEstadísticas de armasConfiguración compartidaGuardar el vientoOleadas como datosRepaso: base de datos de objetosRepaso: comprar en la tienda8Código reutilizable
Métodos de extensiónUn singleton genéricoFunciones auxiliares genéricasRepaso: FindNearest3Eventos
Eventos de C# en UnitySuscribirse en OnEnableCampos UnityEventLos eventos controlan la interfazRepaso: ventana emergente de logrosRepaso: temporizador de la ventana emergentePractica por tu cuenta: Playground de Unity