epelpad

Crear una Referencia en Unity (DLL con código) en VS2015

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/

Crear una Referencia en Unity (DLL con código) en VS2015

Programacion

dll

¡Buenas Taringa! 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? Visual Studio

Requerimientos

Visual Studio 2013 en adelanteUnity 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 

  • Tener todo en un archivo único
  • Programar en VB.NETProgramar en C++, siguiendo este modelo: http://ericeastwood.com/blog/17/unity-and-dlls-c-managed-and-c-unmanaged

Recomendaciones

  • No ser tan borrico 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:

referencias

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...

c sharp

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

Unity

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

unity3d

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:

Visual Studio 2015Crear una Referencia en Unity (DLL con código) en VS2015Programaciondll

Una vez se está abriendo la IDE:

Visual Studio

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.

referencias

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:

c sharp

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.

Unity

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

unity3d

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:

Visual Studio 2015

Crear una Referencia en Unity (DLL con código) en VS2015

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:

Programacion

dll

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

Visual Studio

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 ):

referencias

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 ):

c sharp

Como podemos observar se generarán unos cuantos errores Unity

unity3d

Vamos a solventarlos, para ello:

Añadiremos las referencias desde Visual Studio:

Visual Studio 2015

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

Crear una Referencia en Unity (DLL con código) en VS2015

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

Programacion

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):

dll

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:

Visual Studio

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

referencias

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í

c sharp

Unity

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-unmanagednamespace 

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:


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:

unity3d

Visual Studio 2015

Ahora...

Hagamos lo mismo pero en VB.NET

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

Crear una Referencia en Unity (DLL con código) en VS2015

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

Usaremos nuevamente el mismo código pero transformado a VB:
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:

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.

Programacion
FAQ


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

dll

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

Visual Studio

Q: Missing Component ¿que hago?

referencias

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

c sharp

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! Unity

unity3d

A: Edit > Preferences... > Colors

Visual Studio 2015

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.

Crear una Referencia en Unity (DLL con código) en VS2015

Un saludo.

1 comentario - Crear una Referencia en Unity (DLL con código) en VS2015