Red de conocimiento informático - Conocimiento informático - Cómo escribir complementos nativos de Unity

Cómo escribir complementos nativos de Unity

Unity puede importar código escrito (y compilado) en otros idiomas, llamados complementos nativos. Hoy compartiremos cómo crear un complemento nativo de Unity.

Complementos administrados y no administrados en Unity

La conexión de código dispar no es la primera vez para Unity. Si es usuario de Windows, probablemente haya oído hablar de las DLL (abreviatura de bibliotecas de enlaces dinámicos). Son similares a las aplicaciones independientes en que son software compilado. La diferencia es que no se pueden ejecutar directamente ya que están diseñados específicamente para ser utilizados por otras aplicaciones.

Unity admite dos tipos de complementos: administrados y no administrados. El primero es un lenguaje de código de bytes escrito en C# y compilado en lenguaje intermedio común (CIL). Los complementos alojados son tan potentes como los scripts de C# y vienen con código fuente compilado. Los complementos no administrados (o nativos) son software escrito en otro lenguaje (generalmente C). Tienen pocas limitaciones en cuanto a funcionalidad y, a menudo, son más rápidos que los scripts tradicionales porque están compilados en código de máquina.

Paso 1: Crear un nuevo proyecto C

En este ejemplo, estoy usando Visual Studio 2015; puedes usar cualquier IDE de tu elección para compilar el código C. Comience creando una biblioteca C no administrada, también conocida como nuevo proyecto. Abra Visual Studio, haga clic en Archivo | Nuevo proyecto y seleccione Visual C | Aplicación de consola Win32.

Después de nombrar el proyecto (TestDLL en este ejemplo), asegúrese de que el tipo de aplicación esté configurado en DLL. En Opciones adicionales, seleccione Proyecto vacío.

En este punto, la solución Visual C está lista y podemos empezar a escribir código.

Paso 2: escribir la biblioteca

El código C generalmente se divide en dos archivos. Definición de función (archivo de encabezado) e implementación de función (archivo de implementación). El archivo de implementación es un archivo .cpp ubicado en el directorio ResourceFiles y el archivo de encabezado es un archivo .h con el mismo nombre ubicado en el directorio HeaderFiles. En este ejemplo, creamos un archivo de encabezado y un archivo de implementación. El archivo de implementación contendrá todas las funciones que se guardarán en la DLL. Puede crear un nuevo archivo haciendo clic derecho en la carpeta y seleccionando Agregar>Nuevo elemento.

Parte de ejecución: TestDLLSort.cpp

Comience a codificar para implementar la clasificación de matrices.

[AppleScript]Vista de texto sin formato ¿Copiar código?

#include "TestDLLSort.h". #include extern "C" { void TestSort(int a[], int length) { std::sort(a, a length }}

Las líneas 5-7 usan la matriz de la biblioteca de algoritmos; Función de clasificación std:sort. Sólo se ha agregado el bloque externo "C", que debe usarse para exportar la referencia a TestSort a la DLL.

Archivo de encabezado: TestDLLSort.h

Las definiciones en el archivo de implementación deben ser exactamente las mismas que las del archivo de encabezado. Debe contener el prototipo TestSort y la firma de la función.

[AppleScript]Vista de texto sin formato ¿Copiar código?

123456 #define TESTDLLSORT_API __declspec(dllexport) extern "C" { TESTDLLSORT_API void TestSort(int a[], int length }

La parte restante es crear la DLL TESTDLLSORT_API); El código, que puede tener un nombre arbitrario, se utiliza para marcar todas las funciones exportadas. En software más complejo, TESTDDLLSORT_API debe vincularse a __declspec(dllimport) según sea necesario. Pero en este caso no es necesario.

Paso 3: Compilar

El último paso es compilar nuestra DLL en Visual Studio, asegurándonos de que la plataforma de distribución esté configurada correctamente (32 bits o 64 bits).

En la consola en la parte inferior de la pantalla, verá el siguiente registro de salida:

[AppleScript] Vista de texto sin formato ¿Copiar código?

1gt; ------ Reconstruir Iniciar todo: Proyecto: TestDLL, Configuración: Versión x64 ------ 1gt; TestDLLSort.cpp 1gt; Documents\Visual Studio 2015\Projects\TestDLL\x64\Release\TestDLL.lib y objeto C:\Users\Alan Zucconi\Documents\Visual Studio 2015\Projects\TestDLL\x64\Release\TestDLL.Studio 2015\Projects\TestDLL\ x64\Release\TestDLL.exp 1gt; Código generado 1gt; Las 30 funciones se compilaron porque no se encontró ningún IPDB/IOBJ disponible en la compilación anterior. 1gt; Código generado completo 1gt; TestDLL.vcxproj -gt; C:\Users\Alan Zucconi\Documents\Visual Studio 2015\Projects\TestDLL\x64\Release\TestDLL.dll ========== Reconstruir todo : 1 tuvo éxito, 0 falló, 0 se omitió ==========

Si ve advertencias como: advertencia C4273 enlace dll inconsistente, esto puede indicar que el compilador no está seguro de qué hacer. use_ _declspec(dllimport) o __declspec(dllexport). Utilice este último si desea crear un complemento nativo para Unity.

Paso 4: Importar Unity

Busque la DLL compilada en el archivo del proyecto de acuerdo con el registro de compilación anterior. Sólo necesitamos este archivo. El primer paso para usarlo en Unity es copiarlo a la carpeta Complementos.

Los complementos nativos suelen depender del sistema operativo o de la plataforma. Puede consultar el panel de revisión a la derecha para asegurarse de que cada DLL incluya la plataforma correcta.

Paso 5: Usar en Unity

Después de importar, usar la DLL es relativamente simple.

El primer paso es definir el punto de entrada (EntryPoint) usando DLLImport. Debe especificar el nombre de la DLL y el nombre de la función. Proporcionaremos un alias para que pueda llamarse como cualquier otra función.

[AppleScript]¿Copiar código para ver texto sin formato?

usando UnityEngine; usando System.Runtime.InteropServices; public class TestDLL: MonoBehaviour { // La función importada [DllImport("TestDLL", EntryPoint = "TestSort")] public static extern void TestSort(int [ ] a, int length); public int[] a; void Start() { TestSort(a, a.Length }

[AppleScript] Código de copia de vista de texto plano?}

El nombre de la cadena de entrada debe ser el mismo que el nombre en la biblioteca C. Sin embargo, puedes llamar a la función usando el siguiente método de ahora en adelante, C# llamará a la función de esta manera;

Debes tener en cuenta que Unity no puede detectar archivos DLL no administrados en el editor; debes ejecutar el juego para detectar si la conexión fue exitosa; Para las DLL administradas, se pueden instrumentar estáticamente.