Extension Methods

Los «Extension Methods» (Métodos de extensión) permiten ampliar la funcionalidad de un tipo sin necesidad de crear una clase derivada, por ejemplo cuando lo queremos hacer con alguna de las clases nativas de Unity (Vector3, Transform, etc.)

Estos métodos han de crearse en una clase estática, y es recomendable colocarlos todos en una que sea común para todo el proyecto. En nuestro caso podría ser ExtensionMethods.cs

using UnityEngine;

public static class ExtensionMethods
{
    /// <summary>
    /// Crea un nuevo objeto con la misma posición y rotación que el transform original.
    /// </summary>
    /// <param name="transform">Transform original</param>
    /// <param name="gameObject">GameObject que crea</param>
    /// <param name="sameScale">Si se establece a true, se creará con la misma escala que el original</param>
    /// <returns></returns>
    public static GameObject Spawn(this Transform transform, GameObject gameObject, bool sameScale = false)
    {
        GameObject g = Object.Instantiate(gameObject);
        g.transform.position = transform.position;
        g.transform.rotation = transform.rotation;
        if(sameScale) g.transform.localScale = transform.localScale;
        return g;
    }
}

En esta clase podemos definir los métodos que nos interesen, teniendo en cuenta que:

  • Han de ser estáticos
  • El primer argumento que reciben incluye la palabra clave this, y representa la clase a la cuál le estamos agregando la extensión.

En ejemplo anterior hemos definido un método Spawn que amplía la clase Transform para permitir que se pueda instanciar un nuevo objeto con la misma posición y rotación del transform original.

Ahora ya lo podemos usar en cualquier script de nuestro proyecto.

using UnityEngine;

public class SampleSpawn : MonoBehaviour
{
    public GameObject bullet;

    // Update is called once per frame
    void Update()
    {
        if(Input.anyKeyDown)
        {
            transform.Spawn(bullet);
        }
    }
}