我正在尝试使用名为UnityOSC的Unity库,它允许您从其他应用程序接收OSC消息。我有一个应用程序通过UDP在以下地址传输数据:
主持人:127.0.0.1 港口:33433
我现在需要配置UnityOSC来侦听该数据。该库有一个名为OSCHandler.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
}
}
}
但到目前为止,没有任何内容注册到调试器。知道我做错了吗?
答案 0 :(得分:2)
有两件事,记住我是从命令行而不是在Unity编辑器中完成的,所以事情可能会有所不同。
首先,OSCPacket.cs中的第50行在命令行版本中引发异常。不确定Unity是否选择了Trace.Assert,但是删除行没有任何损害:
Trace.Assert(string.IsNullOrEmpty(_address) == false);
我猜UnityOSC的作者打算做的事情如下:
Trace.Assert(string.IsNullOrEmpty(value) == false);
否则我不确定该断言将如何通过,因为OSCMessage的派生类OSCMessage直接调用其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();
我不得不稍微修改一下作者代码,以使其在Unity之外工作,但只是略微。
答案 1 :(得分:2)
我采用了另一种方式让它在Unity中运行 - 基于James George的一个名为openTSPS的旧项目。您可以在此处下载 - 它接受所有OSC数据: