Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

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

Iniciado por Ikillnukes, Agosto 16, 2016, 06:52:16 PM

Tema anterior - Siguiente tema
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?

Requerimientos
 


  •    Visual Studio 2013 en adelante


  •    Unity 5 o superior (la última versión estable es la 5.4.0f3)


Si quieren una opción gratuita de Visual Studio, aquí está: 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++)


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 borraremos, solo para acceder a la IDE de Visual Studio, lo añadimos al GameObject y borramos cuando la IDE cargue:




Una vez se está abriendo la IDE:


 
 
 


   
   
      
         Se 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.
      
   
[/quote]
 


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




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 Unit***itor.dll



Nota:  Yo copiaría las DLLs por si las moscas, al borrar la carpeta si el proyecto está limpio pueden que desaparezcan.




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
 


  1.    

          namespace  TestCSharpLibrary
       


  2.    

          {
       


  3.    

              public  class  TestCSharpLibrary
       


  4.    

              {
       


  5.    

                  public  static  float  SharpMultiply (  float  a, float  b )  {
       


  6.    

                      return  ( a *  b )  ;
       


  7.    

                  }
       


  8.    

           
       


  9.    

                  public  static  float  SharpDivide (  float  a, float  b )  {
       


  10.    

                      if  ( b ==  0  )
       


  11.    

                      {
       


  12.    

                          return  0  ;
       


  13.    

                      }
       


  14.    

           
       


  15.    

                      return  ( a /  b )  ;
       


  16.    

                  }
       


  17.    

              }
       


  18.    

          }
       


  19.    

           
       


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:
 


  1.    

          using  UnityEngine  ;
       


  2.    

           
       


  3.    

          public  class  NewBehaviourScript :  MonoBehaviour
       


  4.    

          {
       


  5.    

           
       


  6.    

          // Use this for initialization
       


  7.    

          void  Start (  )
       


  8.    

              {
       


  9.    

                 Debug .  Log  ( TestCSharpLibrary .  TestCSharpLibrary  .  SharpMultiply  (  4 , 5  )  )  ;
       


  10.    

          }
       


  11.    

           
       


  12.    

          // Update is called once per frame
       


  13.    

          void  Update (  )
       


  14.    

              {
       


  15.    

           
       


  16.    

          }
       


  17.    

          }
       


  18.    

           
       


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
 


  1.    

          Namespace  TestVBLibrary
       


  2.    

              Public  Class  TestVBLibrary
       


  3.    

                  Public  Shared  Function  BasicMultiply ( a As  Single, b As  Single )  As  Single
       


  4.    

                      Return  ( a *  b )
       


  5.    

                  End  Function
       


  6.    

           
       


  7.    

                  Public  Shared  Function  BasicDivide ( a As  Single, b As  Single )  As  Single
       


  8.    

                      If  b =  0  Then
       


  9.    

                          Return  0
       


  10.    

                      End  If
       


  11.    

           
       


  12.    

                      Return  ( a /  b )
       


  13.    

                  End  Function
       


  14.    

              End  Class
       


  15.    

          End  Namespace
       


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


  1.    

          using  ClassLibrary1.TestVBLibrary  ;
       


  2.    

          using  UnityEngine  ;
       


  3.    

           
       


  4.    

          public  class  NewBehaviourScript :  MonoBehaviour
       


  5.    

          {
       


  6.    

           
       


  7.    

          // Use this for initialization
       


  8.    

          void  Start (  )
       


  9.    

              {
       


  10.    

                 Debug .  Log  ( TestVBLibrary .  BasicDivide  (  24 , 3  )  )  ;
       


  11.    

          }
       


  12.    

           
       


  13.    

          // Update is called once per frame
       


  14.    

          void  Update (  )
       


  15.    

              {
       


  16.    

           
       


  17.    

          }
       


  18.    

          }
       


  19.    

           
       




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

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.



Un saludo.

 
 


Stats


 
 


Cita de: hammer date=1471368270Muy interesante,mil gracias!
   


Gracias a ti por la respuesta!


Muy interesante. Quizá el único PERO que tienen las DLL es que hay que asegurar cierta compatibilidad con dispositivos  y plataformas. Cada cambio requiere compilar la DLL de nuevo.


Etiquetas: