1
1

More than 1 year has passed since last update.

【Unity】OscJackの使い方

Posted at

UnityのOSCライブラリであるOscJackについて調べました。
keijiro/OscJack: Lightweight implementation of OSC server/client in C# (Unity)

本記事の内容はUnityバージョン2021.2.9f1、エディタ上でのみ検証しています。

インストール

Scoped Registryを使用してインストールします。
/Packages/manifest.jsonに以下を追記します。

{
  "scopedRegistries": [
    {
      "name": "Keijiro",
      "url": "https://registry.npmjs.com",
      "scopes": [ "jp.keijiro" ]
    }
  ],
  "dependencies": {
    "jp.keijiro.osc-jack": "1.0.3",
    ...
  }
}

Project Settings > Package ManagerでScoped Registryを登録して、Package ManagerからOSC Jackをインストールすることも可能です。

使い方

OSCの受信

コンポーネントを用いたOSCの受信

EventReceiverコンポーネントで指定したOSCアドレスを受信したときに受信したデータを引数にメソッドを実行することができます。
Add Component > OSC > Event ReceiverからEventReceiverコンポーネントを追加します。
EventReceiver_s.PNG

スクリプトを用いたOSCの受信

OscServerを用いることでスクリプトからOSCを受信できます。
AddCallbackでOSCアドレスとそれを処理するメソッドを紐づけます。AddCallbackで登録するメソッドはメインスレッド外で実行されるので、ほとんどのUnity APIは使用することができません。Unity APIを使用したい場合、自分でキューイングなどの処理を実装する必要があります。

OscJackServerSample.cs
using UnityEngine;
using OscJack;

public class OscJackServerSample : MonoBehaviour
{
    [SerializeField] int port = 8000;
    OscServer server;

    void OnEnable()
    {
        server = new OscServer(port);
        server.MessageDispatcher.AddCallback(
            "/OscJack/sample",
            (string address, OscDataHandle data) => {
                var stringValue = data.GetElementAsString(0);
                var floatValue = data.GetElementAsFloat(1);
                var intValue = data.GetElementAsInt(2);
                Debug.Log($"OscJack receive: {address} {stringValue} {floatValue} {intValue}");
            }
        );
    }

    void OnDisable()
    {
        server.Dispose();
        server = null;
    }
}

OSC受信のモニタリング

Menu > Window > OSC MonitorOSC Monitorウィンドウを開くことができます。OSC Monitorを使用することでOSCの受信をモニタリングすることができます。

OSCの送信

コンポーネントを用いたOSCの送信

Property Senderコンポーネントで指定したオブジェクトのプロパティ値をOSCで送信できます。Add Component > OSC > Property SenderからProperty Senderコンポーネントを追加します。
PropertySender_s.PNG
デフォルトでは値が変化したときのみOSCを送信しますが、Keep Sendingをオンにすると値に変化がなくてもOSCを送信します。

スクリプトを用いたOSCの送信

OscClientを用いることでスクリプトからOSCを送信できます。

using UnityEngine;
using OscJack;

public class OscJackClientSample : MonoBehaviour
{
    [SerializeField] string ipAddress = "127.0.0.1";
    [SerializeField] int port = 8080;
    OscClient client;

    void OnEnable()
    {
        client = new OscClient(ipAddress, port);
    }

    void OnDisable()
    {
        client.Dispose();
    }

    void Update()
    {
        client.Send("/OscJack/sample", 1.23f, 4.56f, 7.89f);
    }
}

OscClient#Sendのオーバーロードメソッドは次のようになっているように、送信できる形式は1~4個のint、1~4個のfloatまたは1つのstringです。

public void Send(string address);
public void Send(string address, int data);
public void Send(string address, int element1, int element2);
public void Send(string address, int element1, int element2, int element3);
public void Send(string address, float data);
public void Send(string address, float element1, float element2);
public void Send(string address, float element1, float element2, float element3);
public void Send(string address, float element1, float element2, float element3, float element4);
public void Send(string address, string data);

まとめ

UnityのOSCライブラリであるOscJackについて解説しました。
EventReceiverPropertySenderといったコンポーネントを使用してOSCを送受信する場合には容易に使用できます。しかし、スクリプトから使用する場合には受信時のキューイングを自分で実装しなければならなかったり、送信できる形式が限定的であったりと少し使う場面を選ぶかなというのが個人的な印象です。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1