Crear una Referencia en Unity (DLL con código en C#/VB.NET/C++) en Visual Studio

Iniciado por z3nth10n, 16 Agosto 2016, 17:40 PM

0 Miembros y 1 Visitante están viendo este tema.

z3nth10n

Actualizo: El post es de mi autoría completamente, de hecho todas las imágenes y códigos que ven los he realizado yo por completo, eso sí, si quieren tener una versión más "actualizada" de este post, por temas de corrección de errores y demás, aquí tienen la versión "oficial": http://lerp2dev.com/UnityDllReferencesTutorial/








¡Buenas foro! Ando realizando otro asset y bueno, investigando en internet y la interfaz de Unity he descubierto la forma de hacer una Referencia para nuestro proyecto.

Simplente, en vez de tener los archivos esparcidos por carpetas de Unity, compilamos una DLL y lo tenemos más recogidito todo. Yo esta técnica la uso para mi API, aunque me arrepiento porque ahora me estoy "jartando" a solventar Excepciones de Null Object Reference pero bueno, haya ustedes,  el proceso es más que simple, eso sí, si no se quieren "jartar" (nuevamente) a buscar información por internet, pueden seguir mi proceso el cual es simple y ¿asequible? :laugh:

Requerimientos


  • Visual Studio 2013 en adelante
  • Unity 5 o superior (la última versión estable es la 5.4.0f3)

Descarga desde EHN de VS 2013: http://foro.elhacker.net/software/visualstudio_2013_u_instaladorplantillassnippetslibscontrolestools-t406378.0.html

Aunque, si quieren una opción gratuita (por si se sienten sucios y tal): https://www.visualstudio.com/es-es/products/vs-2015-product-editions.aspx

Esta es la versión que el setup de Unity te descarga automáticamente.

No lo he probado en versiones de Unity 4, pero por algún lado leí que no se podía, eso si, en Unity 4 + DLL = Unity Pro (1500$) por eso  les digo que Unity 5 en adelante.

Aunque no estoy seguro del todo, ya que, por ejemplo, este tipo tiene problemas en la versión 5.3.0: http://forum.unity3d.com/threads/no-support-for-subclassed-monobehaviours-in-dlls.372971/ cosa que a mi no me ha pasado.

Unity 4.5.x: http://answers.unity3d.com/questions/240985/subclassed-monobehavior-in-external-dlls-not-recog.html

Unity 3: http://answers.unity3d.com/questions/52767/prefabs-not-finding-monobehaviours-moved-into-a-pl.html

De todas formas estan sin confirmar, aunque yo no me fiaría. Nadie utiliza Unity 3, pero para que vean que no miento.

Utilidades


Recomendaciones


  • No ser tan borrico (como yo) para hacerlo con Assets ya hechos, aunque bueno, cosas de no más de 1000 lineas son worth it, pero cosas de 20k de lineas como las mías no jeje
  • Hacer una compilación a cada cambio realizado, por si las moscas hay algún problema, tener localizado cuanto antes
  • Hacer varios pantallazos si tenemos una escena con algún GameObject con algún script que vamos a compilar en la DLL y no tiene los valores por defecto, para luego revertirlo, ya que nos dirá Missing Component

Comencemos...

Yo lo voy a hacer desde 0, para que vean el proceso al completo, primero crearemos un proyecto:



Configuraremos Unity para que habrá nuestros scripts desde Visual Studio (también funcionan Eclipse, Sublime Text y Notepad++ [testado por Mc.Kernel/X3R4CK3R])

Vamos a Edit > Preferences... > External Tools > External Script Editor hacemos click a la lista donde pondrá Monobehaviour y hacemos click en Browse...



La ruta por defecto de VS2015 es "%PROGRAMFILES%\Microsoft Visual Studio 14.0\Common7\IDE\devenv.exe"



Añadimos un gameobject a la escena para añadir luego nuestro primer script (desde GameObject > Create Empty)



Creamos un script de ejemplo que luego usaremos para probar si las DLLs funcionan correctamente y también para acceder a la IDE de Visual Studio, lo añadimos al GameObject, le damos a Edit Script desde la tuerca, y esperamos a que la IDE cargue:



Una vez se está abriendo la IDE:



CitarSe que es tan simple como crear un script nuevo y hacerle doble click o incluso ir el archivo de la solución (DLL Tutorial.sln) creado por Unity para abrirla, pero todo esto tiene una razón y es que luego utilizaremos el mismo GameObject para añadirle este script que será el que usaremos para debugear y ver el resultado.




Una vez aquí, ya hemos superado la primera fase del tutorial, ahora nos dirigimos a la parte complicada, yo voy a utilizar dos métodos, uno compilando mi API y otra haciéndolo con un proyecto vacío, para ambos casos es necesario crear un nuevo proyecto dentro de la misma solución:



Seleccionamos "Biblioteca de clases" (la que está con un icono de C#), le damos un nombre (es opcional) y a mi personalmente me gusta meterla en la capeta del proyecto (la que hay por encima de la carpeta de los Assets) por tema de tenerlo todo en una misma carpeta, pero podéis ponerla donde queráis.



Automáticamente se generará un archivo llamado Class1.cs



Lo utilizaremos para el segundo caso, pero empecemos antes:

Partiendo desde scripts ya hechos

Yo copiaré una carpeta que tenía con scripts preparados y la añadiré dentro de la carpeta del proyecto, para ello, debemos mostrar los archivos que no están incluidos en el proyecto:





Nota: Adicionalmente si el proyecto que estamos creando en Unity como yo, necesitaremos pegar la carpeta al proyecto de Unity para que compile y genere las Referencias requeridas más tarde:





Una vez hecho todo esto, nos vamos a las propiedades del proyecto dentro de Visual Studio (Proyecto > Propiedades de Lerp2API... (en mi caso))



Y cambiamos la versión de compilación del Framework de .NET a la 3.5 (desde Aplicación > Marco de trabajo de destino > .NET Framework 3.5):



A mi me aparece como pueden observar Unity 3.5 .net full Base Class Libraries y otras opciones, no lo tengo testado, pero realmente es lo mismo, las referencias hay que añadirlas si o si.

Ahora ya podemos incluir la carpeta que pegamos con anterioridad en la capreta base del proyecto dentro de la solución de Visual Studio, para ello, como le dimos a mostrar los archivos/carpetas ocultos, simplemente es hacer lo siguiente (hacer click derecho y darle a Incluir en el proyecto):



Como podemos observar se generarán unos cuantos errores >:D



Vamos a solventarlos, para ello:

Añadiremos las referencias desde Visual Studio:



Yo seleccionaré todas las DLLs que hay en la carpeta (Library/UnityAssemblies), pero inicialmente solo se requieren la de UnityEngine.dll y UnityEditor.dll



Nota: Copiad las DLL generadas por Unity, porque al borrar los scripts compilador por Unity, las DLL desapareceran.



Ahora los errores irán de muchos a cero, si hemos añadido todo lo requerido, probablemente, nos haga falta añadir algún que otro archivo/carpeta manualmente, como a mi me paso con el CrossPlatformInput.

Ah, otra cosa, seguramente, sus scripts contengan Directivas de Preprocesador, seguramente les interese tenerlas dentro de la DLL disponibles, para ello, les recomiendo que las añadan (DE AQUÍ QUE SE NECESITE VISUAL STUDIO 2013 EN ADELANTE), para ello vamos a ir a las propiedades del proyecto nuevamente y en el submenú Compilación, añadiremos las palabras que necesitemos, por ejemplo, yo necesito la de UNITY_EDITOR, ustedes añadan ya las que necesiten (simplemente, separandolas por comas):



Todas las keywords que no sean añadidas no serán compiladas después en la DLL.

Para compilar simplemente, hacemos click derecho en el proyecto y compilamos:



Si todo va bien se debería mostrar lo siguiente en la consola:



Ya sería copiar solamente la DLL generada y el archivo de extensión PDB a la carpeta principal o alguna subcarpeta del proyecto de Unity. Este esta en Bin/Debug/Nombre del proyecto.dll

Al añadir la DLL y el archivo PDB la IDE nos va a decir de actualizar todo, nosotros le decimos que sí






Partiendo desde cero

Simplemente es seguir el mismo proceso, crear el proyecto (usando la Biblioteca de Clases, recordar usar la del icono con el C#, aunque lo haremos con VB), establecer la versión de .NET a la 3.5, añadiremos las referencias para poder usarlas luego y poco más.

* Para usar las referencias, deberemos buscarlas en algún sitio, yo no os las puedo suministrar ya que seguramente dentro de poco queden anticuadas, para ello generad un archivo cualquier y ponedle using y el namespace que necesitéis, Unity se encargara del resto, solo copiad las dlls generadas en la carpeta que ya os he dicho, y wala, ahí tenéis las referencias que necesitéis.

Esta vez, usaremos el código de la página que antes dijimos: http://ericeastwood.com/blog/17/unity-and-dlls-c-managed-and-c-unmanaged

Código (CSharp) [Seleccionar]

namespace TestCSharpLibrary
{
   public class TestCSharpLibrary
   {
       public static float SharpMultiply(float a, float b) {
           return (a * b);
       }

       public static float SharpDivide(float a, float b) {
           if (b == 0)
           {
               return 0;
           }

           return (a / b);
       }
   }
}


Y lo añadiremos dentro del archivo Class1.cs generado con nuestro nuevo proyecto, le daremos a compilar como ya hemos mostrado, y usaremos el script que creamos antes para abrir la IDE para mostraros como funciona, simplemente usando este código:

Código (CSharp) [Seleccionar]

using UnityEngine;

public class NewBehaviourScript : MonoBehaviour
{

// Use this for initialization
void Start()
   {
       Debug.Log(TestCSharpLibrary.TestCSharpLibrary.SharpMultiply(4, 5));
}

// Update is called once per frame
void Update()
   {

}
}


Al iniciar el proyecto deberiamos ver en la consola lo siguiente:





Ahora...

Hagamos lo mismo pero en VB.NET

La única diferencia aquí es que al crear el proyecto, debemos usar lo siguiente:



Por lo demás todo es lo mismo, referencias y versión de .NET

Usaremos nuevamente el mismo código pero transformado a VB

Código (vbnet) [Seleccionar]
Namespace TestVBLibrary
   Public Class TestVBLibrary
       Public Shared Function BasicMultiply(a As Single, b As Single) As Single
           Return (a * b)
       End Function

       Public Shared Function BasicDivide(a As Single, b As Single) As Single
           If b = 0 Then
               Return 0
           End If

           Return (a / b)
       End Function
   End Class
End Namespace


Compilamos y añadimos nuevamente al proyecto de Unity, una vez alli, cambiamos el código del Monobehaviour por este:

Código (csharp) [Seleccionar]
using ClassLibrary1.TestVBLibrary;
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour
{

// Use this for initialization
void Start()
   {
       Debug.Log(TestVBLibrary.BasicDivide(24, 3));
}

// Update is called once per frame
void Update()
   {

}
}


Y el resultado obviamente, será 8.

* No se porque, por alguna razón, en el using hay que utilizar la ClassLibrary1, en vez del namespace TestVBLibrary, pero bueno.




FAQ

Q: Me sale este error: Unhandled Exception: System.Reflection.ReflectionTypeLoadException: The classes in the module cannot be loaded.



A: No has cambiado a la versión 3.5 tu proyecto, relee el tutorial para ver donde has fallado.



Q: Missing Component ¿que hago?



A: Si has llegado a este punto, lo mejor que podrías haber hecho hubiera sido unos pantallazos para volver a añadir los scripts a mano, recuerda, que no se van a mostrar los típicos iconos de C# de Unity



Q: Tengo Null Object References por un tubo.

A: Las Null Object References son normales cuando has insertado en la DLL código que no es tuyo, o que has tenido mucho tiempo sin compilar. Por eso, sugerimos que compiles frecuentemente el código para evitar esto. Si el código no es tuyo, ya puedes prepararte para romperte las manos, porque estos apaños llevan la vida literalmente.

Quizás aquí encuentres como ponerle Macros a tu Visual Studio: https://msdn.microsoft.com/es-es/library/ae3cxw0w(v=vs.100).aspx

Q: ¿Cómo puedo tener el Editor Morado como tu? Mola! ;-)



A: Edit > Preferences... > Colors



Extras

¿Quieres cambiar el color de tu Unity a negro teniendo la versión Personal? Usa esta herramienta [UnityDarkSkin]:

https://www.dropbox.com/sh/5yr41qfv7wteqtu/AADMqoBY2mV2uDaeBsz5YwOaa?dl=0

¿Quieres ayudarme con mi API?

https://github.com/Ikillnukes/Lerp2API

Hazle un fork, clona y a trabajar! :silbar:

Descargas

Descarga la última versión de Unity aquí: https://unity3d.com/es/get-unity/download

Nota: Si sois nuevos en esto de Unity, os recomiendo que instaleis ciertos Builds Support como la de WebGL o la de Windows. Para poder compilar vuestro juego tanto para webs como para el sistema de operativo, si no lo hacéis, tendréis que instalar manualmente, o a través (de nuevo) del setup de Unity.






PD: Espero que tanto usuarios como moderadores ayuden a mejorar y hacer este post de lo mejor. Y recordad que si tenéis alguna sugerencia, duda o lo que sea, no olvidéis comentar. ;D

Si veis que algo no esta donde debería estar o podría ser mejorado no dudéis en reportarlo y comentarlo.

Un saludo.





Tenía que hacerlo... :xD

Interesados hablad por Discord.