domingo, 11 de enero de 2015

Unity3D Scripting: Extensiones

Hace tiempo que no traía un tutorial de Unity3D, y este, aunque es muy corto y simple, creo que es muy práctico.

Las extensiones sirven para poder, a través de una clase estática, crear métodos que se podrán llamar desde objetos ya creados de otras clases.


Como podemos ver en la imagen están tres métodos que si intentamos usar en el transform.position o en definitiva en cualquier Vector3, no lo vamos a encontrar, en cambio es algo bastante práctico, y en este tutorial veremos como añadir, ya sea a un Vector3, o a un Transform, GameObject, o cualquier clase en definitiva, un método que se usará de manera externa.


Pasemos a ver el código y a explicarlo paso a paso:

using UnityEngine;

public static class Extensions
{
 public static void SetX(this Vector3 vector, float value)
 {
  vector = new Vector3(value, vector.y, vector.z);
 }

 public static void SetY(this Vector3 vector, float value)
 {
  vector = new Vector3(vector.x, value, vector.z);
 }

 public static void SetZ(this Vector3 vector, float value)
 {
  vector = new Vector3(vector.x, vector.y, value);
 }
}

Este código es bastante sencillo, cuando tratamos con un objeto de la clase Vector3 no nos deja cambiar un valor solo, tendríamos que editarlo entero, así que hemos creado estas funciones que nos permite cambiar el valor de cada uno de los ejes del vector (X, Y y Z).

Para crear este método hemos seguido unos pasos muy sencillos:

public static class Extensions

Lo primero es crear la clase estática y que no herede de MonoBehaviour ni de nada.

Una vez creada cada método tendrá que seguir dos pautas muy simples:

public static void SetX(this Vector3 vector, float value)

Deberá ser un método estático también y el parámetro que lleva el this será el tipo de objeto que podrá usar este método, así de esta manera podremos ver que, cuando usemos un Vector3, por ejemplo el transform.position, nos dará estas opciones que hemos creado en la clase Extensions para usarlo.

Por último recordar que estas funciones deben ser en objetos instanciados, no desde la clase, es decir, en este caso, no funcionaría si pusiesemos Vector3.SetX(0); ya que no es un método estático de la clase vector3 propiamente dicha y lo mas importante, solo será válido para propiedades públicas, en el caso de un Transform.position, ese Vector3 no tiene las variables X, Y, Z públicas así que tendríamos que hacer un método al que le pasemos el Transform y editar el position con un nuevo Vector3.

Así que quedaría de este modo:

 public static void SetX(this Transform transform, float value)
 {
  transform.position = new Vector3(value, transform.position.y, transform.position.z);
 }

No hay comentarios:

Publicar un comentario