3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Unity】extOSCの使い方

Posted at

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を設定します。
Event_s.PNG

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

OSCReceiverコンポーネントを用いてスクリプトからOSCを受信します。#OSCReceiver#BindでOSCアドレスと受信時に実行するメソッドを紐づけます。紐づけるメソッドはメインスレッドで実行されるのでUnity APIも使用することが可能です。

ExtOscReceiverScriptSample.cs
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を、TargetMemberに送信するオブジェクトとそのプロパティを設定します。
Informer_s.PNG
デフォルトではプロパティ値に変化があったときのみOSCが送信されますが、Inform on changedをオフにすると変化がなくても送信するようになります。

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

OSCTransmitterコンポーネントを用いてスクリプトからOSCを送信します。OSCMessageを作成して、OSCTransmitter#Sendで送信します。

ExtOscTransmitterScriptSample.cs
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のインターフェースもシンプルで慣れると使いやすそうな印象を受けました。

3
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
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?