Menu
CoddyTech

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.

challenge icon

Desafío

Intermedio

Un 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ática FlatExtensions.
  • FlatDistance extiende Vector3: a.FlatDistance(b) devuelve la distancia de a a b por el suelo, sin tener en cuenta la diferencia de altura. De (0, 5, 0) a (3, 0, 4) es 5.
  • FaceFlat extiende Transform: t.FaceFlat(target) gira t para 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 sus eyes están encendidos mientras el jugador esté a menos de sight (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 es Vector3.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
quiz iconPonte a prueba

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