Estoy desarrollando un juego simple para un proyecto universitario usando Unity . Este juego hace uso del aprendizaje automático, por lo que necesito TensorFlow para construir una red neuronal (NN) para lograr ciertas acciones en el juego dependiendo de la predicción del NN.

En particular, mi enfoque de aprendizaje es refuerzo de aprendizaje . Necesito monitorear los estados y las recompensas en el entorno [codificado en C #], y pasarlos al NN [codificado en Python]. Luego, la predicción [del código de Python] debe enviarse de vuelta al entorno [al código de C #].

Lamentablemente, estoy bastante confundido sobre cómo dejar que C # y Python se comuniquen. Estoy leyendo mucho en línea, pero nada me ayudó realmente. ¿Alguien puede aclarar mis ideas? Gracias.

1
Matt 27 feb. 2018 a las 23:06

3 respuestas

La mejor respuesta

Tienes pocas opciones:

Subproceso

Puede abrir el script de python a través de C # de Unity y luego enviar datos stdout y stdin hacia y desde el proceso. En el lado de Python es tan simple como input() y print(), y en el lado de C # es básicamente leer y escribir desde un objeto Stream (hasta donde recuerdo)

Sockets UDP / TCP

Puede hacer que su Python sea un servidor UDP / TCP (preferiblemente UDP si tiene que transferir una gran cantidad de datos, y podría ser más sencillo de codificar). Luego, crea un cliente C # y envía solicitudes al servidor Python. El servidor python realizará el procesamiento (¡magia de IA, yayy!) Y luego devolverá los resultados a C # de Unity. En C # tendría que investigar la clase UdpClient, y en Python, el módulo socket.

1
Yotam Salmon 27 feb. 2018 a las 20:11

Una cosa para la comunicación entre procesos que definitivamente vale la pena mirar es (Win32) con nombre de canalizaciones . Es casi tan fácil como escribir o leer archivos. Más fácil que TCP / IP e incluso puede comunicarse a través de la red local, al menos si tiene los derechos de acceso. Agregue su propio código de serialización y listo.

Sin embargo, es un poco asimétrico (en una dirección solo abre un archivo con el nombre de la tubería, en la dirección opuesta debe crear un objeto de tubería con nombre, no recuerda cuál es cuál).

Por ejemplo, consulte Ejemplo de canalizaciones con nombre

Si busca en Google "ventanas de tuberías con nombre", encontrará mucha información. Pero recuerde no usar tuberías anónimas (son feas).

3
oliver 27 feb. 2018 a las 20:25

Puede integrar la DLL compilada de C # de forma nativa con python usando Python para .NET (pythonnet)

Pythonnet es un paquete que brinda a los programadores de Python una integración casi perfecta con .NET 4.0+ Common Language Runtime (CLR) en Windows y Mono runtime en Linux y OSX.

Con este paquete, puede ejecutar aplicaciones .NET o crear aplicaciones completas en Python, utilizando los servicios y componentes .NET escritos en cualquier lenguaje que tenga como destino el CLR (C #, VB.NET, F #, C ++ / CLI).

Instalación

    pip install pythonnet

Utilizando la biblioteca de clases compilada My.dll en python:

    import clr
    clr.AddReference("My.DLL")
    # call methods in dll

Vea un ejemplo de trabajo

Pythonnet en github

Cómo usar el paquete en python WIKI

2
M.Hassan 28 feb. 2018 a las 12:54