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コンポーネントを追加します。

スクリプトを用いたOSCの受信
OscServerを用いることでスクリプトからOSCを受信できます。
AddCallbackでOSCアドレスとそれを処理するメソッドを紐づけます。AddCallbackで登録するメソッドはメインスレッド外で実行されるので、ほとんどのUnity APIは使用することができません。Unity APIを使用したい場合、自分でキューイングなどの処理を実装する必要があります。
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 MonitorでOSC Monitorウィンドウを開くことができます。OSC Monitorを使用することでOSCの受信をモニタリングすることができます。
OSCの送信
コンポーネントを用いたOSCの送信
Property Senderコンポーネントで指定したオブジェクトのプロパティ値をOSCで送信できます。Add Component > OSC > Property SenderからProperty Senderコンポーネントを追加します。

デフォルトでは値が変化したときのみ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について解説しました。
EventReceiverやPropertySenderといったコンポーネントを使用してOSCを送受信する場合には容易に使用できます。しかし、スクリプトから使用する場合には受信時のキューイングを自分で実装しなければならなかったり、送信できる形式が限定的であったりと少し使う場面を選ぶかなというのが個人的な印象です。