[Unity 3D] Publicar y proteger tus assets

Buenas gente, hago este post porque me llevó muchas horas y muchos golpes hasta que pude lograr proteger mi assets de forma correcta y eficiente. Con proteger me refiero a evitar incluir el código fuente del mismo.

Todo comenzó desarrollando un Asset en C# para Unity. Mi idea era antes de publicarlo en el Asset Store, incluir todo el código en una DLL, ofuscarla, y luego distribuirla dentro de Unity. Tuve varios problemas hasta que llegué a una solución.

Aquí enumeraré lo que hice paso a paso.

Introducción


El Asset sobre el cuál trabajé es solo DLL, no incluye otros scripts. Lo que voy a explicar se puede aplicar para assets que incluyan otros recursos y assets que no los incluyan.

Cuando realizan un asset que use scripts, para proteger el código deberán orientar todo a objetos, y desde sus scripts llamar a esos objetos.

Lo que había intentado hacer, que me dió muchos errores era incluir mi DLL generada desde MonoDevelop (de Unity) en otro proyecto Unity limpio. También probé lo que decían muchos de cambiar el Target de compilación a .NET 2.0, etc.

Estos son algunos de los problemas que tuve.

Uno de los errores.

Otro de los errores.


Solución

Introducción

La estructura será la siguiente.

Por un lado, nuestro proyecto principal de Unity en el que tenemos todos los assets y el código fuente.

Por otra parte, un proyecto Mono totalmente limpio al que le copiaremos el código fuente a compilar y distribuir.

En tercer lugar, un proyecto Unity para deployment (distribución). Contendrá las DLL que generemos, y luego todo lo que esté incluído en el Asset (Scripts, Escenas, Recursos, Etc).

Parte 1 - Compilar el código

  1. Descargar la última versión de Mono Develop (ahora llamado Xamarin Studio). Lo puede hacer desde aquí.
  2. Instalarlo obviamente.
  3. Crear un nuevo proyecto, de tipo Class Library o Librería C# vacía. En mi caso a este lo llamé  CodeConverter. Luego crear otro proyecto más si van a hacer algo para el Editor de Unity. En mi caso lo llamé CodeConverter.Editor.
Archivo > Nuevo > Solución

Mis proyectos en la solución.

4. Reducir el .NET Framework de los proyectos. En mi caso seleccioné para CodeConverter el 2.0 de MONO y para el Editor el 3.5 de MONO. Utilicé el 3.5 debido a que una de las DLL que hay que incluir (UnityEditor.dll) referencia a ese framework. Para cambiar el Framework hay que hacer click derecho en cada proyecto > Opciones > General (de Construcción) > Target Framework

Seleccionar Mono / .NET 2.0
5. Referenciar las correspondientes DLL's de Unity 3D. En el manual de Unity 3D explica los Path en los que se encuentran las DLL según el sistema operativo. Aquí el link: http://docs.unity3d.com/Manual/UsingDLL.html


En mi caso las DLL estaban en Program Files (x86)\Unity\Editor\Managed.

Para el proyecto CodeConverter incluí UnityEngine.dll y para el otro proyecto UnityEngine.dll y UnityEditor.dll.

6. En caso de que tengamos un proyecto para el Editor, este debe incluir una referencia del otro proyecto.

Referencias de CodeConverter.Editor

7. Copiar los archivos fuente a proteger dentro de los proyectos correspondientes.

8. Compilar.

Listo, ya tenemos nuestro proyecto compilado. Las Dll generadas se encuentran en las carpetas bin\Debug de cada proyecto. También en bin\Release si compilan en modo Release.

Parte 2 - Ofuscar el código

Para quien no sabe, las dll de .NET muestran todo el código de lo que programamos. No son verdaderas DLL, son archivos comprimidos con código fuente (casi). Entonces es bueno para protegerlas ofuscar el código, es decir, hacerlo ilegible. Para ello existen muchísimos programas, yo voy a usar uno open source muy bueno: Obfuscar. También pueden usar un programa para ver el código de sus DLL antes y después de Ofuscarlo. Yo utilizo Ilspy.

Pasos:

1. Descargar Obfuscar e Ilspy. Pueden hacerlo desde la página oficial de cada uno, o desde aquí.
2. Generar el archivo de Configuración de Obfuscar. Yo lo llamé config.xml.

NOTA: El verdadero outpath es "..\Deployment\Assets\CodeEditor\Dlls", me equivoqué en la imagen.


Lo que hace esta configuración es tomar las DLL del proyecto Mono, ofuscarlas e insertarlas en el proyecto Unity para Deployment.

3. Ejecutar el ofuscador desde la consola de Windows. Como argumento le indicamos el nombre del archivo de configuración. En este caso, el comando es:
Obfuscar.Console.exe config.xml
Una vez ejecutado este comando observamos que los archivos ya se encuentran ofuscados en el directorio de salida configurado.


Parte 3 - Distribuir

Luego de realizar la parte 1 y 2, estamos en condiciones de abrir el proyecto de Deployment. Para ello, lo cargamos desde Unity.

Como se puede observar, al abrir Unity se ven las DLL. A la vez, si incluímos scripts dentro de una DLL deberían verse.


Aquí podemos visualizar dos DLLs. La primera es CodeConverter.dll y la segunda es CodeConverter.Editor.dll. Muestra una clase dentro de la misma llamada "A" (en realidad se llama CodeConverter pero el ofuscador le cambió el nombre). Unity muestra dentro de las DLL los scripts o clases que sean para mostrar en el editor.

Una vez incluidas las DLL, ya estamos en condiciones de enviar el paquete a Unity. Eso lo pueden encontrar buscando en Google, es un procedimiento muy sencillo y hay muchísimos sitios que lo explican, así que hasta aquí ha llegado mi tutorial.

Saludos, espero que sea de utilidad!



Contraseña: programando-soft.blogspot.com

Comentarios

Entradas populares de este blog