Construye el plugin de C ++ para Unity

Tratando de crear mi primer plugin. El código cpp es:

encabezamiento:

#pragma once #ifndef __MY_DLL_H #define __MY_DLL_H extern "C" int add_1(int number); #endif 

fuente:

 //FirstDLL.cpp #include "FirstDLL.h" extern "C" int add_1(int number) { return number + 1; } 

Luego compilo y coloco la DLL en la carpeta Assets/Plugins , el archivo dll es FirstDLL.dll . Desde el lado de la unidad tengo un script simple en C # para un componente:

 using UnityEngine; public class MyBehaviour : MonoBehaviour { // Use this for initialization [Header("Nuts!")] public int my_curr_val; void Start () { } // Update is called once per frame void Update () { print(add_1(my_curr_val)); } [DllImport("FirstDLL")] public static extern int add_1(int number); } 

Pero cuando bash ejecutar el script, aparece el siguiente error:

Complementos: error al cargar ‘Assets / Plugins / FirstDLL.dll’ con error ‘Esta operación solo es válida en el contexto de un contenedor de aplicaciones. ‘. Complementos: error al cargar ‘Assets / Plugins / FirstDLL.dll’ con error ‘Esta operación solo es válida en el contexto de un contenedor de aplicaciones. ‘. DllNotFoundException: FirstDLL MyBehaviour.Update () (en Activos / MyBehaviour.cs: 17)

La documentación parece ser bastante pobre, ¿alguna sugerencia? Hay una respuesta , pero no estoy seguro de lo que estoy haciendo mal. He intentado crear varias soluciones (plataforma universal de Windows, Windows 8.1, etc.) que aún no funcionan.

Estás intentando cargar el complemento UWP en un entorno que no es UWP y esto se debe a la forma en que construyes tu dll.

Esta publicación describe cómo crear, comstackr y construir un complemento de C ++ en Unity.

Versión de software utilizada para esto (también debería funcionar para otras versiones anteriores. Esta información se menciona en caso de que haya una actualización y una interfaz de usuario diferente en el futuro):

  • Microsoft Visual Studio 2015

  • Unidad 2017.2.0f3

1. Ir a Archivo —> Nuevo —> Proyecto …

introduzca la descripción de la imagen aquí

2 . Vaya a Instalado -> Plantillas —> Visual C ++ luego Aplicación de consola Win32 . Escriba el nombre del proyecto y haga clic en Aceptar.

introduzca la descripción de la imagen aquí

3. Haga clic en Siguiente en lugar de Finalizar :

introduzca la descripción de la imagen aquí

4. Seleccione DLL y deseleccione el encabezado precomstackdo y luego haga clic en finalizar:

introduzca la descripción de la imagen aquí

5. Ahora puede crear sus archivos de origen (.cpp) y encabezado (.h).

A .Crear un archivo fuente:

Esto debe colocarse en la carpeta de archivos de origen . Haga clic derecho en Archivos de origen —> Agregar —> Nuevo elemento …

introduzca la descripción de la imagen aquí

B .Seleccione el archivo C ++ (.cpp), escriba el nombre del archivo “FirstDLL.cpp” y haga clic en Agregar.

introduzca la descripción de la imagen aquí

Ejemplo de fuente de prueba de C ++:

 #include "FirstDLL.h" int add(int num1, int num2) { return num1 + num2; } int multiply(int num1, int num2) { return num1 * num2; } int substract(int num1, int num2) { return num1 - num2; } int divide(int num1, int num2) { return num1 / num2; } 

A .Crear un archivo de cabecera:

Esto debe colocarse en la carpeta de archivos de encabezado . Haga clic con el botón derecho en Archivos de encabezado —> Agregar —> Nuevo elemento …

introduzca la descripción de la imagen aquí

B. Seleccione Archivo de encabezado (.h) , escriba el nombre del archivo “FirstDLL.h” y luego haga clic en Agregar.

introduzca la descripción de la imagen aquí

Ejemplo de encabezado correspondiente:

 #ifndef FIRSTDLL_NATIVE_LIB_H #define FIRSTDLL_NATIVE_LIB_H #define DLLExport __declspec(dllexport) extern "C" { DLLExport int add(int num1, int num2); DLLExport int multiply(int num1, int num2); DLLExport int substract(int num1, int num2); DLLExport int divide(int num1, int num2); } #endif 

Eso es. Ahora puedes escribir tu código de plugins de C ++ allí.

6. Asegúrese de configurar la comstackción para liberar y la plataforma a 64 bits

introduzca la descripción de la imagen aquí

Si usa 32 bits, configure la plataforma en x86.

7 . Plugin de construcción:

Ir a Construir —> Construir Solución

introduzca la descripción de la imagen aquí

8 . Importando en la Unidad:

PC, Mac y Linux Standalone :

Coloque el archivo dll de 64 bits en la carpeta Assets/Plugins .

Si solo desea admitir 32 bits, coloque el complemento en Assets/Plugins/x86 .

Si desea admitir universal (plataforma de 32 y 64 bits), compile la dll como tal y Assets/Plugins/x86_64 carpeta Assets/Plugins/x86_64 .

Android :

Se puede construir desde Android Studio .

Para construir desde Visual Studio:

A .Ir a Archivo —> Nuevo —> Proyecto …

B. Vaya a Instalado -> Plantillas —> Visual C ++ y luego Plataforma cruzada . Haga clic en Instalar soporte de Android para C ++ (Actualizar x) . luego siga las instrucciones para instalarlo.

introduzca la descripción de la imagen aquí

C. Vaya a Instalado -> Plantillas —> Visual C ++ —> Plataforma cruzada . luego android . Seleccione Dynamic Shard Library (Android) , escriba el nombre del proyecto y haga clic en Aceptar. Ahora, puede volver al paso # 5 para continuar la encoding en C ++.

introduzca la descripción de la imagen aquí

Coloque el archivo del complemento de Android (no dll) en la carpeta Assets/Plugins/Android . La extensión de complemento de C ++ soportada .so .

Nota : Si el nombre del complemento de Android es libFirstDLL-lib.so , elimine el prefijo lib y el .so al hacer referencia a él desde C #. En este caso, sería [DllImport("FirstDLL-lib")] diferencia de lo que Habría estado en el # 9.

Si tiene los armeabi-v7a y x86 Android, entonces armeabi-v7a Assets\Plugins\Android\libs\armeabi-v7a y Assets\Plugins\Android\libs\x86 respectivamente.

iOS

Puede construirse desde Xcode o incluir el archivo fuente en Unity. También puedes crearlo con Visual Studio también. Simplemente siga el paso de Android anterior, pero use Instalar soporte de iOS para C ++ (Actualizar x) esta vez en lugar de Instalar soporte de Android para C ++ (Actualizar x) . Tenga en cuenta que necesita una computadora Mac para comstackr para iOS o usar una máquina virtual. Una vez que haga esto, siga estas instrucciones de Microsoft para finalizar la configuración para que Visual Studio pueda comunicarse y construir el proyecto en su Mac OS.

Coloque el archivo del complemento iOS (no dll) en la carpeta Assets/Plugins/iOS . Las extensiones de complementos compatibles son .a , .m , .mm , .c , .cpp .

Debe usar [DllImport ("__Internal")] lugar de [DllImport("PluginName")] o [DllImport("FirstDLL")] como se ve a continuación en # 9 .

9 . Llamando a la función C ++ desde Unity / C # :

 [DllImport("FirstDLL")] public static extern int add(int num1, int num2); [DllImport("FirstDLL")] public static extern int multiply(int num1, int num2); [DllImport("FirstDLL")] public static extern int substract(int num1, int num2); [DllImport("FirstDLL")] public static extern int divide(int num1, int num2); void Start() { Debug.Log("Add: " + add(10, 2)); Debug.Log("Multiply: " + multiply(10, 2)); Debug.Log("Substract: " + substract(10, 2)); Debug.Log("Divide: " + divide(10, 2)); } 

Salida :

introduzca la descripción de la imagen aquí


10 . SOLUCIÓN DE PROBLEMAS DE ERRORES DE PLUGIN:

1 .Contrando el error:

DllNotFoundException:

introduzca la descripción de la imagen aquí

Solución 1 :

El nombre de la DLL especificada en DllImport no coincide con el nombre de Dll. Asegúrate de que coincidan cambiándolos de nombre y luego reinicia Unity.

introduzca la descripción de la imagen aquí

Solución 2 :

La DLL se coloca en la carpeta incorrecta. La carpeta debe ser nombrada Assets/Plugins . La ortografía también es sensible a mayúsculas y minúsculas.

introduzca la descripción de la imagen aquí


2. Obteniendo el error:

EntryPointNotFoundException:

introduzca la descripción de la imagen aquí

Solución 1 :

El nombre de la función declarada DllImport no existe o coincide con el declarado en el lado C ++. Asegúrese de que la ortografía sea la misma en ambos lados. La ortografía también es sensible a mayúsculas y minúsculas.

introduzca la descripción de la imagen aquí

Solución 2 :

Las funciones de DLL de C ++ no se incluyen en el complemento de C ++. En Windows, dllexport se usa para hacer que estas funciones se exporten a sí mismas en la DLL. Esto no es necesario en otras plataformas o sistemas operativos. Esto generalmente se hace en el archivo de encabezado solo para mantener limpio el archivo de origen. Ver ejemplo en el archivo de encabezado anterior o captura de pantalla a continuación.

introduzca la descripción de la imagen aquí

Solución 3 :

Tu comstackdor está renombrando las funciones de C ++. Puede evitar esto encerrándolos con la palabra clave extern . De nuevo, vea el ejemplo en el archivo de encabezado anterior o en la captura de pantalla siguiente:

introduzca la descripción de la imagen aquí

2 .No obtenemos ningún error pero el resultado es incorrecto o está conectado:

introduzca la descripción de la imagen aquí

Solución 1 :

El parámetro no coincide. Asegúrese de que el parámetro de la función en el lado C ++ y C # coincida y tenga la misma cantidad de parámetro. También el tipo de datos debe coincidir. Si no lo hacen, espere un comportamiento indefinido.

introduzca la descripción de la imagen aquí