Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Unity3d和UdpClient_C#_Sockets_Mono_Unity3d - Fatal编程技术网

C# Unity3d和UdpClient

C# Unity3d和UdpClient,c#,sockets,mono,unity3d,C#,Sockets,Mono,Unity3d,我想使用套接字将UDP包读入Unity3d。UDP包由另一个C#应用程序发送,该应用程序不是Unity应用程序。因此,我将以下脚本()附加到我的一个游戏对象上。不幸的是,当我运行我的项目时,Unity冻结了。谁能告诉我为什么 using UnityEngine; using System.Collections; using System; using System.Threading; using System.Net; using System.Net.Sockets; using Syst

我想使用套接字将UDP包读入Unity3d。UDP包由另一个C#应用程序发送,该应用程序不是Unity应用程序。因此,我将以下脚本()附加到我的一个游戏对象上。不幸的是,当我运行我的项目时,Unity冻结了。谁能告诉我为什么

using UnityEngine;
using System.Collections;
using System;
using System.Threading;
using System.Net;
using System.Net.Sockets;
using System.Text;

public class InputUDP : MonoBehaviour
{
    // read Thread
    Thread readThread;

    // udpclient object
    UdpClient client;

    // port number
    public int port = 9900;

    // UDP packet store
    public string lastReceivedPacket = "";
    public string allReceivedPackets = ""; // this one has to be cleaned up from time to time

    // start from unity3d
    void Start()
    {
        // create thread for reading UDP messages
        readThread = new Thread(new ThreadStart(ReceiveData));
        readThread.IsBackground = true;
        readThread.Start();
    }

    // Unity Update Function
    void Update()
    {
        // check button "s" to abort the read-thread
        if (Input.GetKeyDown("q"))
            stopThread();
    }

    // Unity Application Quit Function
    void OnApplicationQuit()
    {
        stopThread();
    }

    // Stop reading UDP messages
    private void stopThread()
    {
        if (readThread.IsAlive)
        {
            readThread.Abort();
        }
        client.Close();
    }

    // receive thread function
    private void ReceiveData()
    {
        client = new UdpClient(port);
        while (true)
        {
            try
            {
                // receive bytes
                IPEndPoint anyIP = new IPEndPoint(IPAddress.Any, 0);
                byte[] data = client.Receive(ref anyIP);

                // encode UTF8-coded bytes to text format
                string text = Encoding.UTF8.GetString(data);

                // show received message
                print(">> " + text);

                // store new massage as latest message
                lastReceivedPacket = text;

                // update received messages
                allReceivedPackets = allReceivedPackets + text;

            }
            catch (Exception err)
            {
                print(err.ToString());
            }
        }
    }

    // return the latest message
    public string getLatestPacket()
    {
        allReceivedPackets = "";
        return lastReceivedPacket;
    }
}

注意:我想使用IPC将我们的游戏逻辑与Unity连接起来(使用Unity只是一个渲染引擎)。C#应用程序包含游戏逻辑。我需要传输的数据包括所有可能的控制状态,例如不同玩家/对象的位置/方向等。两个应用程序都在同一台机器上运行。

默认情况下,您的接收被阻止-因此更新调用正在等待接收完成

在创建客户端后添加以下内容:

client.Client.Blocking = false;

添加接收超时

client.Client.ReceiveTimeout = 1000;