martes, 16 de diciembre de 2014

Aprender C# orientado a Unity3D

Ya tenía ganas de volver a sacar algo relacionado con Unity3D y no estaba seguro de que y el usuario de Twitter @Esteve_Segura me ha dado una buena idea para una entrada a la vez que por supuesto, dar una contestación mas larga que los 140 caracteres de Twitter.


Tenemos que partir de una base que al menos a mi, se me hace un poco extraña, tenemos un lenguaje orientado a objetos que dentro de Unity3D, entonces ¿Que hacemos? ¿Nos basamos en crear clases muy grandes con herencia y que una grande controle el juego? ¿O hacemos scripts pequeños con las líneas precisas para una pequeña función del software?
En mi experiencia personal, tras estar trasteando con Unity3D, trabajando y conocer a otras personas que se dedican a ello e intercambiar ideas, opiniones y sobretodo experiencia, he llegado a la conclusión de que hay que usar ambas cosas pero cada una estará enfocada a una parte del desarrollo.

En primer lugar si, vamos a crear clases que llamaremos "Clases script" las cuales, a través de la herencia con "Monobehaviour" podemos usar ciertos métodos definidos por Unity3D que nos permitirán de manera muy sencilla digamos que llevar el control del juego y con pocas líneas de código, estos scripts serán solo para las cosas que interfieran directamente con la escena, es decir, un objeto que necesite de otros objetos para interactuar en la escena como por ejemplo una nave que dispara balas, esto será una "Clase script" la gestión de los disparos.

Y ahora bien, ¿Entonces para qué queremos las clases orientadas a objetos normales? pues siguiendo el mismo ejemplo, podríamos tener una clase que nos gestionase las balas o en general, que nos gestionase la creación de objetos, en caso de no tener bastantes balas para disparar, que nos crease mas, y si hay bastantes que buscase una desactivada para poder usarla de nuevo.

Otro ejemplo que quizás deje mas claro la diferencia sería por ejemplo una clase para leer y escribir en un JSON o XML para guardar datos de las partidas, tan sencillo como para poder guardar datos mas complejos que los que nos permite el playerprefs de Unity3D, y después llamar a esta clase o crear un objeto de esta clase para interaccionar con nuestras partidas guardadas, para cargarlas o salvarlas.

Digamos que el código mas complejo y sobretodo el mas reutilizable como herramienta fuera de los métodos de Monobehaviour serían los que usaríamos como lenguaje orientado a objetos, y en caso de los scripts serían especialmente los que usan esta clase Monobehaviour que nos dá por defecto Unity3D al crear una nueva clase de c#.

Si nos acostumbramos a trabajar con la programación por scripts de Unity3D debemos intentar volver a usar las clases como lo que son, y hay muchísima documentación para ello, de lo cual recomiendo el MSDN de microsoft el cual está en español e inglés además de traer numerosos ejemplos.

Aquí dejaré algunos enlaces para aprender a programar con C# de manera general que por supuesto, si aprendemos a hacerlo como para lo que realmente está preparado C#, como lenguaje orientado a objetos para crear software genérico, usarlo dentro de Unity3D no nos supondrá ningún problema, pero por supuesto, ver que hay ciertas clases que podemos crear como pequeños recursos para la escena como si fuesen scripts nos agilizará nuestro proceso de creación además de tener ciertas cosas de manera mas descentralizadas para poder usarlas cada vez que te pueda ser necesario con tan solo arrastrar y soltar a los objetos de la escena.

Finalmente dejaré aquí un par de enlaces que considero de alto interés para aprender C# en español:

http://msdn.microsoft.com/es-es/library/z1zx9t92.aspx

http://dis.um.es/~bmoros/privado/bibliografia/LibroCsharp.pdf

Quizás un buen debate sería el por qué elegir C# en vez de javascript o boo, que son otros lenguajes que trae Unity3D y sus buenos motivos tienen.

Edit: aprovecho para añadir un par de enlaces de interés dentro de esta misma web para saber, que métodos usar y para que sirven de la clase monobehaviour y buenas prácticas dentro de Unity3D.

http://www.hagamosvideojuegos.com/2014/02/unity3d-scripting-monobehaviour.html

http://www.hagamosvideojuegos.com/2014/02/unity3d-scripting-optimizacion-de.html

PD: Por último decir que salió hace un par de días la tercera entrega de mis tutoriales de Unity3D y hago un peqfspoiler de que en la siguiente nos pondremos a trastear código donde espero poder dejar algo más claro estos conceptos.