Настройка клиента и сервера с использованием 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:

https://github.com/heaversm/UnityOSC_FS

Имея в виду две вещи, я сделал это из командной строки, а не из редактора 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, но лишь слегка.

Другие вопросы по тегам