Métodos de extensión
Parte de la sección Arquitectura de juegos en Unity del Journey de Unity de Coddy. Lección 33 de 50.
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 les perteneciera. 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, así que v es una copia: WithY no puede cambiar el vector del llamador 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 su propio archivo .cs, que puede tener cualquier nombre, y nunca se añade a un objeto. Los métodos que hereda un MonoBehaviour, como Destroy, necesitan que se indique aquí su clase: Object.Destroy. Destruir los hijos dentro del foreach es seguro, porque Unity los elimina solo al final del frame.
Desafío
IntermedioUn búho sobre un poste alto vigila el patio. Las flechas mueven al Player (listo). Añade al proyecto dos métodos de extensión y úsalos en el búho:
- En
FlatExtensions.cs, escribe una clase estáticaFlatExtensions. FlatDistanceextiende Vector3:a.FlatDistance(b)devuelve la distancia deaabpor el suelo, sin tener en cuenta la diferencia de altura. De (0, 5, 0) a (3, 0, 4) es 5.FaceFlatextiende Transform:t.FaceFlat(target)giratpara que mire hacia el objetivo solo alrededor de y, de modo que se mantenga erguido, sin importar lo alto o bajo que esté el objetivo.- En
Owl.cs, en cada fotograma, el búho mira al jugador con FaceFlat, y suseyesestán encendidos mientras el jugador esté a menos desight(3) de distancia por el suelo, y apagados en caso contrario. El búho está en lo alto de su poste, así que esto no esVector3.Distance.
Pulsa Play, camina alrededor del poste y por debajo del búho, y luego pulsa Check.
Pruébalo tú mismo
using UnityEngine;
// FlatExtensions: FlatDistance y FaceFlat
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
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 modular4Datos serializados
Clases serializablesListas en el InspectorEnumeraciones en el InspectorRepaso: tabla de botín7Máquinas de estados
Estados como clasesUna máquina de estadosTransicionesCerebros de enemigosRepaso: estados de puertas10Proyecto: Superviviente de la arena
El héroeTipos de enemigos2Interfaces en Unity
IDamageableInterfaces y TryGetComponentGetComponentsRepaso: tecla de interacción5ScriptableObjects
Recursos de datosEstadísticas de armasConfiguración compartidaOleadas como datosRepaso: base de datos de objetos8Código reutilizable
Métodos de extensiónUn singleton genéricoFunciones auxiliares genéricasRepaso: FindNearest