C# 在Unity中使用OSC配置客户端和服务器

C# 在Unity中使用OSC配置客户端和服务器,c#,udp,unity3d,osc,opensoundcontrol,C#,Udp,Unity3d,Osc,Opensoundcontrol,我试图利用Unity的一个名为UnityOSC的库,它允许您接收来自其他应用程序的OSC消息。我有一个通过UDP在以下地址传输数据的应用程序: 主持人:127.0.0.1 港口:33433 我现在需要配置UnityOSC以侦听该数据。该库有一个名为oschHandler.cs的脚本,在init函数中,您可以设置客户端和服务器。我只是不知道如何设置 目前,我正在尝试: public void Init() { CreateClient("FaceClient", IPAdd

我试图利用Unity的一个名为UnityOSC的库,它允许您接收来自其他应用程序的OSC消息。我有一个通过UDP在以下地址传输数据的应用程序:

主持人:127.0.0.1 港口:33433

我现在需要配置UnityOSC以侦听该数据。该库有一个名为oschHandler.cs的脚本,在init函数中,您可以设置客户端和服务器。我只是不知道如何设置

目前,我正在尝试:

public void Init()
    {
        CreateClient("FaceClient", IPAddress.Parse("127.0.0.1"), 33433);    
        CreateServer("FaceServer", 6666); 
    }
我已经将客户机参数与传输数据的应用程序的参数进行了匹配,服务器只是随机的——但老实说,我不确定在这两个参数中放入什么。理论上,如果我正确设置客户端/服务器,我应该能够在更新功能中注册信息,如下所示:

void Update() {

    OSCHandler.Instance.UpdateLogs();
    //clients = OSCHandler.Instance.Clients;
    servers = OSCHandler.Instance.Servers;

    foreach(KeyValuePair<string, ServerLog> item in servers)
    {
        // If we have received at least one packet,
        // show the last received from the log in the Debug console
        if(item.Value.log.Count > 0) 
        {
            int lastPacketIndex = item.Value.packets.Count - 1;

            UnityEngine.Debug.Log(String.Format("SERVER: {0} ADDRESS: {1} VALUE 0: {2}", 
            item.Key, // Server name
            item.Value.packets[lastPacketIndex].Address, // OSC address
            item.Value.packets[lastPacketIndex].Data[0].ToString())); //First data value
        }
    }
}
void Update(){
oschHandler.Instance.UpdateLogs();
//clients=oschHandler.Instance.clients;
servers=oschHandler.Instance.servers;
foreach(服务器中的KeyValuePair项)
{
//如果我们至少收到一个数据包,
//在调试控制台中显示上次从日志接收到的
如果(item.Value.log.Count>0)
{
int lastPacketIndex=item.Value.packets.Count-1;
UnityEngine.Debug.Log(String.Format(“服务器:{0}地址:{1}值0:{2}”),
item.Key,//服务器名称
item.Value.packets[lastPacketIndex].Address,//OSC地址
item.Value.packets[lastPacketIndex].Data[0].ToString());//第一个数据值
}
}
}

但到目前为止,没有任何东西注册到调试器。你知道我做错了什么吗?

有两件事,记住我是从命令行而不是在Unity编辑器中做的,所以事情可能会有所不同

首先,OSCPacket.cs中的第50行在命令行版本中引发异常。不确定Unity是否拾取Trace.Assert,但删除该行不会造成任何影响:

Trace.Assert(string.IsNullOrEmpty(_address) == false);
我猜UnityOSC的作者想做一些类似的事情:

Trace.Assert(string.IsNullOrEmpty(value) == false);
否则,我不确定该断言将如何传递,因为OSCMessage是OSCPacket的一个派生类,它直接调用其ctor中的Address属性

其次,如果您试图在本地计算机上测试此功能,您的端口需要匹配:

    public void Init()
    {
        CreateServer("Server", 5555);
        CreateClient("Client", IPAddress.Parse("127.0.0.1"), 5555);
    }
最后,我的手工创作:

        OSCHandler handler = new OSCHandler();
        handler.Init();
        handler.SendMessageToClient<string>("Client", "127.0.0.1", "TestMessage");
        handler.UpdateLogs();
oschHandler=新的oschHandler();
handler.Init();
handler.SendMessageToClient(“客户端”、“127.0.0.1”、“测试消息”);
handler.UpdateLogs();

我不得不稍微修改authors代码,使其在Unity之外工作,但只是稍微修改一下。

有两件事,请记住,我是从命令行而不是在Unity编辑器中完成的,所以事情可能会有所不同

首先,OSCPacket.cs中的第50行在命令行版本中引发异常。不确定Unity是否拾取Trace.Assert,但删除该行不会造成任何影响:

Trace.Assert(string.IsNullOrEmpty(_address) == false);
我猜UnityOSC的作者想做一些类似的事情:

Trace.Assert(string.IsNullOrEmpty(value) == false);
否则,我不确定该断言将如何传递,因为OSCMessage是OSCPacket的一个派生类,它直接调用其ctor中的Address属性

其次,如果您试图在本地计算机上测试此功能,您的端口需要匹配:

    public void Init()
    {
        CreateServer("Server", 5555);
        CreateClient("Client", IPAddress.Parse("127.0.0.1"), 5555);
    }
最后,我的手工创作:

        OSCHandler handler = new OSCHandler();
        handler.Init();
        handler.SendMessageToClient<string>("Client", "127.0.0.1", "TestMessage");
        handler.UpdateLogs();
oschHandler=新的oschHandler();
handler.Init();
handler.SendMessageToClient(“客户端”、“127.0.0.1”、“测试消息”);
handler.UpdateLogs();

我不得不稍微修改authors代码,使其在Unity之外工作,但只是稍微修改一下。

我采用了另一种方法,使其在基于Unity的环境中工作,这是基于James George的一个名为openTSPS的老项目。您可以在此处下载-它接受所有OSC数据:


我采用了另一种方法,在基于Unity的基础上实现了这一功能,它来自James George的一个名为openTSPS的老项目。您可以在此处下载-它接受所有OSC数据:


您是否有指向正在玩的库的Web链接?您是否有指向正在玩的库的Web链接?