UnityのOSCライブラリであるextOSCについて調べました。
Iam1337/extOSC: extOSC is a tool dedicated to simplify creation of applications in Unity with OSC protocol usage.
本記事の内容はUnityバージョン2021.2.9f1、エディタ上でのみ検証しています。
インストール
Scoped Registryからインストール
/Packages/manifest.jsonに以下を追記します。
{
"scopedRegistries": [
{
"name": "package.openupm.com",
"url": "https://package.openupm.com",
"scopes": [
"com.iam1337.extosc",
]
}
],
"dependencies": {
"com.iam1337.extosc": "1.19.7",
...
}
}
Project Settings > Package ManagerでScoped Registryを登録して、Package Managerからインポートすることも可能です。
Git URLからインストール
Package ManagerのAdd package from git URL...で以下のURLを追加してインポートします。
https://github.com/iam1337/extOSC.git#upm
unitypackageでインストール
Releasesページからunitypackageをダウンロードしてインポートします。
Asset Sotreからインストール
extOSCはAsset Storeでも公開さています。
extOSC - Open Sound Control | Input Management | Unity Asset Store
使い方
インポートしたパッケージのルートにドキュメントが存在しています。またサンプルも充実しており、Package Managerからインポートすることができます。
OSCの受信
extOSCでOSCを受信するには、OSCReceiverコンポーネントを使用します。
Add Component > extOSC > OSC ReceiverからOSCReceiverコンポーネントを追加することができます。Menu > GameObject > extOSC > OSC ManagerからもOSCReceiverコンポーネントと後述するOSCTransmitterコンポーネントを持つオブジェクトを作成することが可能です。
コンポーネントを用いたOSCの受信
Eventコンポーネントを使用してOSCを受信するごとにメソッドを実行することができます。
Add Component > extOSC > Components > ReceiverからEventコンポーネントを追加します。Eventコンポーネントはデータ型ごとに存在しているので、受信するOSCのデータに合わせて選択します。EventコンポーネントのOSC Receiverプロパティに使用するOSCReceiverを設定します。

スクリプトを用いたOSCの受信
OSCReceiverコンポーネントを用いてスクリプトからOSCを受信します。#OSCReceiver#BindでOSCアドレスと受信時に実行するメソッドを紐づけます。紐づけるメソッドはメインスレッドで実行されるのでUnity APIも使用することが可能です。
using UnityEngine;
using extOSC;
public class ExtOscReceiverScriptSample : MonoBehaviour
{
[SerializeField] int port = 8000;
OSCReceiver receiver;
void Start()
{
receiver = gameObject.AddComponent<OSCReceiver>();
receiver.LocalPort = port;
receiver.Bind("/extOSC/sample", MessageReceived);
}
void MessageReceived(OSCMessage message)
{
Debug.Log($"extOSC receive: {message.Values[0].StringValue} {message.Values[1].FloatValue} {message.Values[2].IntValue}");
}
}
OSCの送信
extOSCでOSCを送信するには、OSC Transmitterコンポーネントを使用します。
Add Component > extOSC > OSC TransmitterからOSC Transmitterコンポーネントを追加するか、先述したようにMenu > GameObject > extOSC > OSC ManagerからOSCTransmitterコンポーネントを持つオブジェクトを作成します。
コンポーネントを用いたOSCの送信
Informerコンポーネントを使用して、オブジェクトのプロパティ値をOSCで送信できます。
Add Component > extOSC > Components > Transmitterから送信するデータ型にあったInformerコンポーネントを追加します。InformerコンポーネントのOSC Transmitterプロパティに使用するOSCTransmitterを、TargetとMemberに送信するオブジェクトとそのプロパティを設定します。

デフォルトではプロパティ値に変化があったときのみOSCが送信されますが、Inform on changedをオフにすると変化がなくても送信するようになります。
スクリプトを用いたOSCの送信
OSCTransmitterコンポーネントを用いてスクリプトからOSCを送信します。OSCMessageを作成して、OSCTransmitter#Sendで送信します。
using UnityEngine;
using extOSC;
public class ExtOscTransmitterScriptSample : MonoBehaviour
{
[SerializeField] string ipAddress = "127.0.0.1";
[SerializeField] int port = 8080;
OSCTransmitter transmitter;
void Awake()
{
transmitter = gameObject.AddComponent<OSCTransmitter>();
transmitter.RemoteHost = ipAddress;
transmitter.RemotePort = port;
}
void Update()
{
var message = new OSCMessage("/extOSC/sample");
message.AddValue(OSCValue.String("hoge"));
message.AddValue(OSCValue.Float(123.456f));
message.AddValue(OSCValue.Int(100));
transmitter.Send(message);
}
}
OSCのモニタリング
Menu > Tools > extOSC > OSC ConsoleからOSC Consoleウィンドウを開くことができます。OSC CnosoleウィンドウではextOSCによるOSCの送受信を確認することができます。
OSCのデータ値のマッピング
extOSCでは送受信するOSCの値をマッピングすることができます。
まず、Menu > Tools > extOSC > OSC MappingからOSC Mappingウィンドウを開き、CreateボタンからOSC Map Bundleアセットを作成します。OSC Mappingウィンドウでマッピングの設定後にOSCの受信ではOSCReceiverコンポーネントまたはEventコンポーネントに、OSCの送信ではOSCTranmitterコンポーネントまたはInformerコンポーネントのMap Bundleプロパティに作成したOSC Map Bundleアセットを設定します。
まとめ
UnityのOSCライブラリであるextOSCの使い方について解説しました。
extOSCは他のOSCライブラリと比較して高機能なので初見では難しく感じますが、実際にはAPIのインターフェースもシンプルで慣れると使いやすそうな印象を受けました。