martes, 29 de septiembre de 2015

Preparar un proyecto de Unity3D para Git

Si queremos trabajar en un proyecto varias personas,  ya sea trastear con sus diferentes escenarios, configuraciones, código, imágenes, sonidos, etc... Lo ideal sería usar un repositorio para poder editar todos cosas a la vez pudiendo sincronizarse a través de la red, aquí veremos una buena configuración de Unity3D para cualquier tipo de repositorio y como usar uno de ellos, en este caso Git, que no solo es el mas popular a día de hoy si no que además, es el que yo mismo suelo usar tanto para trabajar como para, a partir de ahora, subir mis ejemplos como dije en la entrada anterior.
Unity + Git
Sincronizando Unity3D y Git
En primer lugar pasaremos por la configuración de Unity3D que es lo más rápido y que por supuesto, una vez configurado, nos servirá para cualquier tipo de repositorio (CVS, GIT, SVN...), solo debemos de abrir Unity3D y en la barra de menú abrir Edit > Project Settings > Editor para que nos salga este menú el cual deberemos configurar.
Los valores borrosos no son necesarios para el repositorio, esos podemos dejarlos como estén o en todo caso, adaptarlos a nosotros, pero ese es otro tema que abarcar otro día, por último recordar que hay valores que se le añaden a esta configuración dependiendo de la plataforma para la que vayas a crear el juego, lo importante son estos dos parámetros.

Version Control Mode: En este caso hay que usar la opción Visible Meta Files para que los archivos generados por Unity (Los que terminan en extensión .Meta) se puedan subir al servidor, esto es muy importante ya que ahí guardamos la configuración de los mismos y para que todos tengamos bien sincronizado todo, deberíamos subir todos los '.meta' siempre al servidor.

Asset Serialization: Hay que especificar la opción Force Text para que tanto las escenas, como los prefabs se guarden en modo texto por lo cual podrían verse los cambios en GIT y a su vez, si fuese necesario, poder hacer "merge" en caso de conflicto entre el archivo que tenemos nosotros y el que hay en el servidor para crear un archivo que conserve nuestros cambios y los de servidor.

Finalmente aconsejo, para ahorrar espacio innecesario en el repositorio, además de ser totalmente innecesario subirlo e incluso nos saldrán muchos archivos que cambiarán constantemente ya que son temporales durante la creación de la aplicación y para uso en memoria, no influyen en el estado del proyecto, aquí pondré el archivo '.ignore' que yo suelo usar para ignorar dichos archivos y no subirlos a nuestro servidor, este archivo debería estar en la raiz de nuestro proyecto.

# =============== #
# Unity generated #
# =============== #
Temp/
Library/

# ===================================== #
# Visual Studio / MonoDevelop generated #
# ===================================== #
ExportedObj/
obj/
*.svd
*.userprefs
/*.csproj
*.pidb
*.suo
/*.sln
*.user
*.unityproj
*.booproj

# ============ #
# OS generated #
# ============ #
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db

Con esto podremos evitar añadir los archivos temporales, de sistema y generados por Unity3D que no son necesarios para que, cuando otra persona se una al proyecto, o quieras volver a descargar el proyecto, te ahorres ese tiempo de espera, ya que Unity3D te los generará el solo, los tengas o no.

Para la siguiente aprovecharé para explicar como configurar nuestro proyecto de GitHub además de explicar algunos conceptos básicos de como usar un repositorio para aquellos que no lo tengan muy claro.

martes, 22 de septiembre de 2015

C# AntiHack! Evitando que hackeen tu juego

Después de un verano y sindrome posvacacional vuelvo a la carga!

Antes de comenzar con esta entrada aprovecho para decir que la mayoría del código que vaya haciendo lo iré colgando en GitHub, así se tendrá más fácil acceso al contenido, si bien estará comentado todo en inglés, no te preocupes, aquí lo explicaré en español y paso a paso.

Una de las formas de hacking de videojuegos mas comunes, editar la memoria RAM
Como en este caso, la clase que he creado para encriptar variables en la memoria RAM.

En primer lugar, ¿Para qué quiero encriptar las variables en memoria?
Hay ciertos datos que nos gustaría que bajo ningún concepto pudiesen editar ya que, si por ejemplo tenemos un juego en el que puedes comprar monedas con dinero real, pues si acceden al valor en memoria del dinero y lo editan podrían tener dinero infinito con el cual podrían acceder a todo el contenido y los desarrolladores no ganarían el dinero por el esfuerzo de dicho desarrollo, y ese tipo de datos suele ser mucho más sensible, así como datos que se envíen a servidores en un MMORPG por ejemplo para evitar que los modifiquen e intenten añadir código malicioso o que les dé ventaja respecto a los demás y por supuesto pues los motivos internos de cada desarrollo.

 Dicho esto, el código está en mi cuenta de GitHub, solo hay que descargar el archivo CryptedData.cs y usarlo es muy sencillo, en un script que creemos nosotros añadimos esta línea:

CryptedData<int> cryptedInt = new CryptedData<int>(3);

Creamos un objeto de tipo CryptedData diciendo de que tipo será el objeto o valor que nos va a retornar, ya podría ser un int,  un string, un objeto de cualquier tipo de clase que nosotros necesitemos, en este caso un int de valor 3 por defecto ya que es el valor que le hemos pasado como parámetro.

Dicho dato, evidentemente, debe de ser del mismo tipo que el que ponemos entre los símbolos de mayor y menor que (< >).

Y para editarlo es tan sencillo como acceder a su valor de esta manera, ya sea para modificarlo o usarlo.

cryptedInt.value = 10;
Debug.Log(cryptedInt.value); 

Y con esto tendremos bajo una seguridad compleja de descifrar aunque a la vez bastante rápida.

He de remarcar que con el cifrado que he usado, los objetos pesarán el doble en memoria, ya que usará una clave de cifrado internamente del mismo tamaño que el objeto, así que hay que intentar no excederse y usarlo solo para lo imprescindible si no queremos saturar la memoria ram.

En principio usar esta clase podría parecer que estamos usando variables normales y corrientes pero internamente lo está ocultando en la memoria ram, si quieres probarlo e incluso encontrar fallos de seguridad o mejorar el algoritmo, por supuesto puedes sentirte en plena libertad de aportar, a partir de ahora subiré todas las clases que vaya creando y considere interesantes a mi repositorio.

Si quieres saber como funciona pues en otra ocasión destriparé la clase aquí paso a paso para ver el proceso, esta clase, si bien no tiene que ver con videojuegos directamente, si con la seguridad de los mismos, seguramente no será el último código que añada sobre seguridad aquí ya que es algo que también me apasiona.