Extendiendo el Codigo de Unity

Algo que me ha resultado muy util y practico muchas veces es la capacidad de añadir metodos, a las clases sin necesidad de reescribir el codigo original, algunas veces simplemente queremos realizar tareas comunes o simples en GameObjects o Transform o cualquier otro objecto cosntruido por unity, y ademas quieres que estos metodos sean accesibles desde cualquier script, si eres un poco obsesionado como yo en mantener tu codigo limpio y legible no quedras colocar ese metodo en cualquier script o peor aun ir copiando esa pieza de codigo en todos los scripts que lo necesites (que miedo!!!).

Es aqui donde entra al rescate algo que se conoce como extension methods o metodos de extension, si quieres una explicacion profunda aqui esta la documentacion, pero en resumidas cuentas como ya dije podras agregar metodos a objetos ya construidos, ejemplo si quieres que un GameObject siga a posicion del mouse que es algo bastante comun, simplemente podrias escribir tu codigo y podras hacer uso de el desde cualquier script podrias escribir algo como gameObject.FollowMouse() (por cierto porque no existe algo asi en Unity??!!) , entonces primero dejame mostrarte las reglas basicas para construir correctamente un extension method y luego te mostrare algunas aplicaciones utiles para el mismo.

Como Hacer un Extension Method


public static class ExtensionMethods
{
public static void MyExtension(this GameObject go)
{
//do something
}
}



Como podemos ver es bastante sencillo solo hay un par de cosas que debemos recordar, primero la clase debe ser estatica para que pueda ser accesible desde cualquier punto, la clase no pude heredar de MonoBehaviour (no te procupes solo nos quita la posibilidad de usar cosas como el Update, Start etc) y si no ha sido una equivocacion antes de la palabra GameObject he puesto this, como a lo mejor ya sabes (deberias saberlo!) la palabra this se utiliza para referirse al propio objecto, en cualquier otro contexto dentro de esta pequeña pieza de codigo funcionaria asi, pero en este caso se refiere que el objecto que recibe es el mismo que realiza el llamado (????!!!!) , ejemplo:



public static class Test : MonoBehaviour
{
void Start()
{
GameObject go = new GameObject("Hola");
go.MyExtension();
}
}


En este ejemplo hacemos un llamado a nuestro extension method, pero un momento no hemos pasado ningun argumento y el metodo esta esperando un objecto de tipo GameObject?, tranquilo como ya he dicho al colocar la palabra this antes del GameObject en el extension method, C# entiende que el elemento a pasar es el propio objecto, ejemplo esta linea podria ser interpretada de esta manera GameObject.MyExtension(go); o go.MyExtension(go); pero en fin.


Aja y Enserio Esto Puede Llegar a ser Util?

Si y mucho, te dejare algunos ejemplos de metodos que he hecho.


public static class ExtensionMethods
{

public static Camera GetBlurCamera(this Camera cam)
{
return GameObject.Find("BlurCamera").GetComponent<camera>();
}

public static void SetRenderCamera(this Canvas canvas)
{
canvas.worldCamera = Camera.main;
}

public static void Reset(this GameObject go)
{
go.transform.position = Vector3.zero;
go.transform.rotation = Quaternion.identity;
go.transform.localScale = Vector3.one;
}

public static void SetMousePos(this GameObject go)
{
Vector3 headingToObject = go.transform.position - Camera.main.transform.position;
float depth = Vector3.Dot(headingToObject , Camera.main.transform.forward);

Vector3 mouseScreenPos = Input.mousePosition;
mouseScreenPos.z = depth;
Vector3 mouseWorldPos = Camera.main.ScreenToWorldPoint(mouseScreenPos);
go.transform.position = mouseWorldPos;
}

}


Aqui hay cosas muy interesantes en primer lugar el GetBlurCamera, aveces en algunos proyectos tengo mas de una camara activa para logar diferentes efectos como el desenfoque del blur, y en lugar de tratar de adivinar cual es puede usar este metodo para traerla siempre, el SetRenderCamera aunque no lo parezca es muy util, cuando instancias objectos directamente desde Resources folder para iniciar tu escena campos como el render camera de un canvas que son necesarios no son guardados cuando se transforman en un prefab, entonces utilizo este metodo despues de instanciar cada Canvas, luego el Reset que creo no necesita mucha explicacion, y el SetMousePos es un ejemplo de lo util que pueden llegar a ser estos pequeños trozos de codigo, entonces es momento de que desates tu imaginacion a ver si encuentras alguna super caracteristica perdida en Unity que puedas agregar y si quieres compartirla siempre puedes actualizar el proyecto desde Gtihub.

el codigo el libre para modificar o usarse desde Github(link)

Si te ha sido util recuerda compartir saludos!!!

Soy apasionado a las computadores, me encatan todo tipo de juegos desde que tengo memoria y actualmente tratando de ganarme la vida desarrollando juegos.

1 comentario:

  1. Wynn Slots for Android and iOS - Wooricasinos
    A free app for slot 토토 machines wooricasinos.info from WRI Holdings Limited deccasino that lets you microtouch solo titanium play the popular games, such as free video slots, table games and live ventureberg.com/ casino

    ResponderEliminar