Métodos de extensión
Parte de la sección Arquitectura de juegos en Unity del Journey de Unity de Coddy. Lección 42 de 64.
Vector3 y Transform pertenecen a Unity, así que no puedes añadirles un método. Un método de extensión es un método estático que C# te permite llamar como si perteneciera a esos tipos. Estos dos ahorran líneas que aparecen en todos los proyectos:
public static class UnityExtensions
{
public static Vector3 WithY(this Vector3 v, float y)
{
return new Vector3(v.x, y, v.z);
}
public static void DestroyChildren(this Transform parent)
{
foreach (Transform child in parent)
{
Object.Destroy(child.gameObject);
}
}
}// en cualquier script
transform.position = transform.position.WithY(0.5f);
inventoryPanel.DestroyChildren();Tres cosas definen un método de extensión: una clase estática que no está anidada ni es genérica, un método estático y this antes del primer parámetro. Ese parámetro es el valor a la izquierda del punto, así que transform.position.WithY(0.5f) se compila como UnityExtensions.WithY(transform.position, 0.5f). Vector3 es una estructura, por lo que v es una copia: WithY no puede cambiar el vector de quien lo llama y, en su lugar, devuelve uno nuevo. Así también se evita transform.position.y = 0.5f;, que no se compila.
La clase estática no es un MonoBehaviour. Está en un archivo .cs propio, puede tener cualquier nombre y nunca se añade a un objeto. Los métodos que hereda un MonoBehaviour, como Destroy, necesitan que aquí se indique su clase: Object.Destroy. Es seguro destruir los hijos dentro del foreach, porque Unity los elimina solo al final del fotograma.
Desafío
IntermedioDale al búho dos métodos de extensión.
- En
FlatExtensions, agregaFlatDistance(this Vector3 a, Vector3 b)como método estático público: la distancia sin tener en cuenta la altura,5de (0, 5, 0) a (3, 0, 4). - Del mismo modo,
FaceFlat(this Transform t, Vector3 target)giratsolo alrededor del eje y. - En
Owl, haz que mire al jugador con FaceFlat;eyesse encienden cuando FlatDistance es menor quesight.
Presiona «Jugar» y camina debajo del búho: sus ojos brillarán. Después, presiona «Comprobar».
Pruébalo tú mismo
using UnityEngine;
public static class FlatExtensions
{
// FlatDistance (Vector3) y FaceFlat (Transform) van aquí
}
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