我有一个用Unity写的游戏,需要通过UDP实时接收数据。这些数据将通过无线方式从一款Java编写的安卓设备传输而来,而Unity程序则是用C#编写的。我的问题是,每当我尝试声明一个 UdpClient
对象,并在 Unity 的 Update()
方法中调用它的 Receive()
方法时,游戏就会挂起。以下是我试图放入 Update()
方法中的代码 -
UdpClient client = new UdpClient(9877);
IPEndPoint receivePoint = new IPEndPoint(IPAddress.Parse("192.168.1.105"), 9877);
byte[] recData = client.Receive(ref receivePoint);
但是这导致游戏停顿。
我尝试了不同的方法 - 我尝试在一个单独的线程中接收数据。如果我只需要接收字节数组,那么它就像魔法一样好用。没有问题。但是,我还需要使用接收到的数据作为实际游戏中使用的函数的参数(现在,我们假设我需要将接收到的数据字节作为字符串显示在主游戏窗口中)。但是,我不知道 Unity 中如何跨线程工作。我尝试了这个方法 -
string data = string.Empty;
private IPEndPoint receivePoint;
void OnGUI()
{
GUI.Box(new Rect(20, 20, 100, 40), "");
GUI.Label(new Rect(30, 30, 100, 40), data);
}
void Start()
{
LoadClient();
}
public void LoadClient()
{
client = new UdpClient(9877);
receivePoint = new IPEndPoint(IPAddress.Parse("192.168.1.105"), 9877);
Thread startClient = new Thread(new ThreadStart(StartClient));
startClient.Start();
}
public void StartClient()
{
try
{
while (true)
{
byte[] recData = client.Receive(ref receivePoint);
System.Text.ASCIIEncoding encode = new System.Text.ASCIIEncoding();
data = encode.GetString(recData);
}
}
catch { }
}
但是,如果我尝试上面的方法,我的程序就会卡住。那么,我到底缺少了什么?
Receive()
),那么是的-这是不允许的。每个主机:端口只允许一个侦听器。 - Isak Savo