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 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.

challenge icon

Desafío

Intermedio

Dale al búho dos métodos de extensión.

  1. En FlatExtensions, agrega FlatDistance(this Vector3 a, Vector3 b) como método estático público: la distancia sin tener en cuenta la altura, 5 de (0, 5, 0) a (3, 0, 4).
  2. Del mismo modo, FaceFlat(this Transform t, Vector3 target) gira t solo alrededor del eje y.
  3. En Owl, haz que mire al jugador con FaceFlat; eyes se encienden cuando FlatDistance es menor que sight.

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

Practica por tu cuenta: Playground de Unity