如何使c#in Unity与Python通信
我正在为Unity游戏制作一个Q-Learning机器人,机器人是用Python编写的,游戏是用c#编写的,我如何让这两个程序交换任何类型的数据(如整数、字符串数组等)? 任何让Python和c#for Unity通信的方法都可以解决我的问题, 我可以将任何东西集成到我的代码中 编辑:另一个问题与我的问题类似,但答案并没有解释从Python方面应该做什么如何使c#in Unity与Python通信,c#,python,unity3d,C#,Python,Unity3d,我正在为Unity游戏制作一个Q-Learning机器人,机器人是用Python编写的,游戏是用c#编写的,我如何让这两个程序交换任何类型的数据(如整数、字符串数组等)? 任何让Python和c#for Unity通信的方法都可以解决我的问题, 我可以将任何东西集成到我的代码中 编辑:另一个问题与我的问题类似,但答案并没有解释从Python方面应该做什么 我的Python版本是3.6。我假设机器人和游戏是分开的,可能是远程进程。对于双向通信,可以考虑使用一些消息中间件或Web服务。 我怀疑更大的
我的Python版本是3.6。我假设机器人和游戏是分开的,可能是远程进程。对于双向通信,可以考虑使用一些消息中间件或Web服务。 我怀疑更大的问题是在事物的统一方面。与大多数专有平台一样,Unity有自己的网络API。我不确定在Unity中使用独立的基于http或tcp的服务有多复杂 Unity文档中包含与非Unity应用程序的集成。如果你想走web服务的道路,Webhooks将是你最好的选择
RabbitMQ显然有一个很好的解决方案,您可以找到其他类似的开源项目。这就是我用来在unity和python之间进行通信的地方。来自不同来源/教程的混合 (这对我来说是可行的,但一个已知的问题是,当python中出现错误时,Unity会冻结。我已经编写了一个try/catch方法,返回一个空的bytearray,但这似乎不起作用。) C#脚本
using UnityEngine;
//using System.Net;
using System.Net.Sockets;
using System;
public class SocketFloat : MonoBehaviour
{
public string ip = "127.0.0.1";
public int port = 60000;
private Socket client;
[SerializeField]
private float[] dataOut, dataIn; //debugging
/// <summary>
/// Helper function for sending and receiving.
/// </summary>
/// <param name="dataOut">Data to send</param>
/// <returns></returns>
protected float[] ServerRequest(float[] dataOut)
{
//print("request");
this.dataOut = dataOut; //debugging
this.dataIn = SendAndReceive(dataOut); //debugging
return this.dataIn;
}
/// <summary>
/// Send data to port, receive data from port.
/// </summary>
/// <param name="dataOut">Data to send</param>
/// <returns></returns>
private float[] SendAndReceive(float[] dataOut)
{
//initialize socket
float[] floatsReceived;
client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
client.Connect(ip, port);
if (!client.Connected) {
Debug.LogError("Connection Failed");
return null;
}
//convert floats to bytes, send to port
var byteArray = new byte[dataOut.Length * 4];
Buffer.BlockCopy(dataOut, 0, byteArray, 0, byteArray.Length);
client.Send(byteArray);
//allocate and receive bytes
byte[] bytes = new byte[4000];
int idxUsedBytes = client.Receive(bytes);
//print(idxUsedBytes + " new bytes received.");
//convert bytes to floats
floatsReceived = new float[idxUsedBytes/4];
Buffer.BlockCopy(bytes, 0, floatsReceived, 0, idxUsedBytes);
client.Close();
return floatsReceived;
}
}
如果要发出请求,请让Unity脚本(您正在使用的脚本)从SocketFloat派生:
public class Turing : SocketFloat
调用ServerRequest将从Python返回一个预测
float[] prediction = ServerRequest(myArray)
我读了一点,你是对的。谢谢你的帮助。
s.listen(30)
不会“听30秒”。从文档中,该参数“指定系统在拒绝新连接之前允许的未接受连接数”
float[] prediction = ServerRequest(myArray)