Настройка клиента и сервера с использованием OSC в Unity
Я пытаюсь использовать библиотеку для Unity под названием UnityOSC, которая позволяет вам получать сообщения 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
}
}
}
Но пока ничего не регистрируется в отладчике. Есть идеи, что я делаю не так?
2 ответа
Я пошел другим путем, чтобы заставить это работать в Unity - на основе более старого проекта openTSPS от Джеймса Джорджа. Вы можете скачать его здесь - он принимает все данные OSC:
Имея в виду две вещи, я сделал это из командной строки, а не из редактора Unity, поэтому все может быть иначе.
Во-первых, строка 50 в OSCPacket.cs генерирует исключение в версии командной строки. Не уверен, что Unity обнаружит Trace.Assert или нет, но ничего не помешает удалить строку:
Trace.Assert(string.IsNullOrEmpty(_address) == false);
Я предполагаю, что автор UnityOSC хотел сделать что-то вроде:
Trace.Assert(string.IsNullOrEmpty(value) == false);
В противном случае я не уверен, как это утверждение пройдет, поскольку OSCMessage, производный класс OSCPacket, напрямую вызывает свойство Address в своем ctor.
Во-вторых, если вы пытаетесь проверить это на локальной машине, ваши порты должны соответствовать:
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, но лишь слегка.