Tengo un motor de juego C++ que actualmente es compatible con Windows, Linux y Android (NDK). Está construido sobre SDL y usa OpenGL para renderizar.
Una de las limitaciones de diseño de este motor de juegos es que el costo de desarrollo debe ser de $0.00; la construcción del motor no debe tener ningún costo para mí (aparte de las horas de mano de obra), se me debe permitir redistribuir libremente el código y los archivos binarios del motor. y los usuarios deberían poder vender juegos creados con el motor sin restricciones.
En este momento, estoy usando un lenguaje de secuencias de comandos interpretado muy lento para la lógica del juego; en realidad, funciona bien para escribir código de pegamento y respuestas simples a eventos de la interfaz de usuario, pero no mucho más.
Me gustaría reemplazar este sistema con una solución de C#: hacer que el usuario compile una biblioteca de clases de C# (DLL) que contenga su lógica de juego, y que el lado de C++ "consuma" esta DLL y llame a los ganchos apropiados.
Ha sido bastante difícil encontrar información sobre cómo lograr esto de una manera multiplataforma. Cada plataforma tiene una forma diferente de alojar los tiempos de ejecución necesarios. Además, la mayoría de los artículos que he encontrado sugieren el uso de marcos completos que proporcionan abstracciones de plataforma que ya están implementadas en mi motor.
¿Existe actualmente una forma de ejecutar código desde una DLL de C# desde una aplicación de C++ basada en el NDK de Android sin usar un SDK completamente diferente y sin tener que desembolsar cientos de dólares por una licencia?
En particular, estoy mirando algunas de las iniciativas .net de código abierto recientes de Microsoft: ¿hay algo que pueda usar?
EDITAR: para aclarar, Windows y Linux tienen formas bien documentadas de ejecutar el código .net 'gratis'; esta pregunta se refiere específicamente a llamar código administrado desde una aplicación NDK de Android SIN pagar tarifas de licencia a Xamarin u otro proveedor.
Ha sido bastante difícil encontrar información sobre cómo lograr esto de una manera multiplataforma...
Solo voy a abordar el tema de "escribir una vez, ejecutar en todas partes".
Construyo y mantengo una biblioteca, compuesta por un único conjunto de fuentes, que se ejecuta en Windows, Linux, OS X, Windows Phone, Android e iOS. Para hacer eso, tuve que escribir todo en C/C++ portátil y luego compilar archivos DLL u objetos compartidos.
El proyecto usa la interoperabilidad .Net para llamar a la DLL, y Android usa JNI para llamar al objeto compartido. En iOS, se crea una biblioteca estática en lugar de un objeto compartido.
La DLL o el objeto compartido tiene algunas definiciones específicas de la plataforma. Por ejemplo, debe saber cómo obtener números aleatorios del sistema operativo subyacente. Entonces tendrá una función como:
bool GetRandomNumbers(unsigned char* ptr, size_t size) { #if defined(WIN32) || defined(WIN64) ... #elif defined(__linux___) || defined(linux) ... #elif defined(__ANDROID___) ... #endif } Por lo tanto, mantenga su lógica comercial central portátil y en una DLL u objeto compartido, #define dónde debe abstraer las diferencias de plataforma y estará bien.
Además de la biblioteca portátil, se superponen las cosas de la GUI específicas de la plataforma.
Si intentas escribir esto en C# y luego lo usas en otras plataformas, simplemente te estarás causando problemas. La única manera de hacer portabilidad con un solo conjunto de fuentes es usar C/C++ portátil.
También he visto a personas volver a implementar en todos los idiomas: C y Win32 para Windows, .Net para Windows, C para Linux, Cocoa para OS X, .Net para Windows Phone, Java para Android y CocoaTouch para iOS. Eso crea alrededor de 6 veces el trabajo, y los comportamientos nunca son los mismos en todas las plataformas.
Un motor de secuencias de comandos popular para juegos es Lua; podría considerar usar eso, ya que es trivialmente fácil de vincular con C/C++. Si usa LuaJIT, también es increíblemente rápido en Android (y no está mal en iOS).
Una alternativa a considerar es que si crea su motor personalizado sobre Cocos2d-X , no solo obtendrá Lua (o JavaScript) de forma gratuita como un motor de secuencias de comandos conectado, sino que también obtendrá la portabilidad a Windows (Win32 y Windows 8.1 Universal), iOS, Mac y Linux, un IDE (!!) y una gran comunidad de apoyo.
O puede dedicar mucho tiempo a averiguar cómo integrar C# en su motor.
La respuesta simple es no , lo que está buscando no existe actualmente. Deberá eliminar/cambiar los requisitos para encontrar una solución.
Lo más cercano que conozco es dot42 , que parece admitir parte de .net en Android, recientemente se colocó en github y el sitio principal se cerró, pero no se menciona la licencia en el repositorio principal del compilador (He agregado un error para actualizar eso ..)
No está claro que admita la carga dinámica de C# .dll, ya que afirma compilar a DEX. (Pero puede ser gratis, dependiendo de lo que los desarrolladores publiquen como licencia...)
Xamarin es la única otra alternativa factible que conozco, pero como sabe, solo la edición de inicio es gratuita.
Si lo que busca es puramente una mejor compatibilidad con las secuencias de comandos, eliminaría los requisitos compilados y de C# y buscaría algo que ya funcione bien en Android. Lua es mi solución preferida para este tipo de cosas, pero no la he usado en Android antes... y existen muchas otras opciones.