¿Cómo hacer que Unity se pueda modificar con scripts de forma amistosa?

Estoy construyendo un juego en Unity usando C # y Visual Studio. Quiero hacer posible que los usuarios escriban código en algunas secuencias de commands (para propósitos de modificación) sin necesidad de abrir la fuente. ¿Cuáles son mis mejores opciones?

Preferiría opciones bien respaldadas y probadas en batalla que se integren bien con Unity y visual studio, pero estoy dispuesto a hacer una buena cantidad de trabajo , siempre que haga que las secuencias de commands sean lo más fluidas posible para futuros modders.

Un enfoque un tanto contundente sería permitir a los modders escribir el código C # y luego hacer que tu juego lea y compile esos guiones , usándolos como si fueran el código con el que se construyó el juego.

Esto tiene algunas ventajas:

  • Los modders pueden usar la API de Unity existente, por lo que ya es familiar para muchos, con una extensa documentation y tutoriales.

  • Es muy rápido de poner en marcha, exponiendo un set de características muy grande, con muy poco desarrollo de API o código de soporte que necesita proporcionar.

… Y algunas desventajas:

  • El set de características expuestas es muy grande, más o less todo lo que C # puede hacer. Como se describe en la respuesta vinculada, un modificador con este tipo de acceso puede hacer básicamente lo que quiera con su juego. No conozco ninguna forma contundente de bloquearlos de una funcionalidad particular o restringir lo que pueden modificar una vez que les ha permitido ejecutar código arbitrario.

  • Esto significa que instalar un mod escrito por un extraño requiere un alto nivel de confianza. Podrían tener spyware codificado u otro contenido malicioso, por lo que tu juego puede usarse como un vector de ataque contra jugadores incautos. No necesariamente una situación en la que quieras estar.

  • Como se describe en la respuesta vinculada, la compilation en time de ejecución no es compatible con todas las plataforms a las que Unity puede llegar, y requiere complementos adicionales en algunas.

Una solución más robusta, como se menciona en el enlace, es build su propia máquina virtual, utilizando, por ejemplo. El patrón de bytecode : para que pueda ejecutar las secuencias de commands que ha cargado como datos en time de ejecución, con un control estricto sobre lo que están autorizados a hacer.

Como alternativa más avanzada y más poderosa, podrías intentar usar frameworks MAF o MEF para C #. Entre otras cosas, maneja la detección automática de mods, la carga y descarga en time de ejecución, la security controlable y mejora la estabilidad (puede ejecutarse en dominios separados).
La desventaja es que el layout de una architecture compatible con complementos es mucho más difícil que la simple compilation de files de text. Si bien es poderoso, también impone algunos requisitos en el código cargado, ya que está diseñado principalmente para sistemas de complemento / DI que podría resultar demasiado restrictivos, o ideales, dependiendo de lo que se supone que deben hacer / agregar / modificar los mods.

Podrías hacerlo como lo hace el Kerbal Space Program: permite que tu juego cargue AssetBundles en time de ejecución haciendo que lea los files de configuration que le dicen dónde y de qué manera se supone que los activos en el package aparecen en el juego.

Luego dígale a sus modders que obtengan Unity Personal Edition y que lo usen para build su mod como uno de esos packages de activos con un file de configuration apropiado. Es posible que necesites abrir la fuente de algunas de tus interfaces y ofrecerlas como un package de activos "mod SDK" para tus modders con el fin de interactuar correctamente con el rest de tu juego.

Este método tiene la ventaja de que tus modders pueden hacer cualquier cosa que la Unidad pueda hacer, lo cual es un montón de cosas agradables. Pero desafortunadamente, este método tiene la desventaja de que los modders pueden hacer cualquier cosa que la Unidad pueda hacer, que también incluye muchas cosas maliciosas. Entonces debes educar a tus jugadores para que no descarguen ningún mod que encuentren.

Si quieres un modding más seguro, entonces necesitas invertir un poco más de trabajo. Un buen método para save adecuadamente las modificaciones es usar un lenguaje de scripting que le permita exponer selectivamente ciertas funciones de su juego. Podrías escribirlo tú mismo, pero diseñar un buen lenguaje de progtwigción y escribir un intérprete es mucho más difícil de lo que parece. Una mejor solución puede ser usar un motor de scripts existente. Existen motores de scripting para C # disponibles para prácticamente cualquier lenguaje de scripting conocido.