見出し画像

【Unity】OscCoreでOSC通信する

OSCライブラリのOscCoreを使ってUnityでOSC通信を行ってみます。

1. OscCore

Unity用のOSCライブラリとしては、UnityOSCOscJackがありますがOscCoreによると、これらのライブラリは大量のメッセージを受け取るとメモリのガーベージコレクションが生じるため、OscCoreではパフォーマンスを意識してより小さくて速いライブラリとして作成されているようです。

また、UnityOSCはREADMEにあるように、今後サポートやメンテナンスは行わないと明言されているため、現在はまだ解説サイトが少ないOscCoreを使った通信を今回は試していきたいと思います。

Unityで利用する際は、リリースページからUnityパッケージをダウンロードしてプロジェクトへインポートします。使用するOscCoreのバージョンは1.1.0、Unityのバージョンは2020.3.12 LTSで解説を進めていきます。

2. サーバ側

OscCoreはサーバとクライアント両方の機能に対応しています。OscCoreのインポートが完了したら、シーンに適当にオブジェクトを配置し、「OSC Receiver」と「Float Input」コンポーネントをアタッチします。

スクリーンショット 2021-06-26 150553

「OSC Receiver」はその名の通り、サーバとしてメッセージを受信する実体で、ポート番号はこの例では9000番でリッスンしています。

「Float Input」は今回、float型のデータを受け取るために使用します。例えばInteger型であれば「Integer Input」というように、やり取りする型に応じてコンポーネントを変更してください。OscCoreでは以下の型のInputが用意されています。

スクリーンショット 2021-06-26 134521

「Float Input」のReceiverには一緒にアタッチしたOSC Receiverが割り当てられていることを確認します。割り当てられていない場合は、ドラッグアンドドロップして割り当てます。

Addressにはエンドポイントとなる任意のパスを設定します。今回の例では/hogeとしています。

次にメッセージを受信したときに行う処理を記述します。以下のスクリプトを作成し、OSC Receiverと同じオブジェクトにアタッチしてください。(必ずしも同じオブジェクトである必要はありません)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ServerExample : MonoBehaviour
{     
   public void Hoge(float value) {
       Debug.Log("Value: " + value);
   }
}

アタッチができたら、「Float Input」に再び戻りOn Message Received (Single)の「+」ボタンを押します。ここでメッセージを受信したときに実行するメソッドを指定します。

スクリーンショット 2021-06-26 195514_New

先ほど作成したスクリプトをOn Message Receivedにドラッグアンドドロップし、実行するメソッドとして右のプルダウンから「ServerExample.Hoge」を選択します。指定するときはDynamic floatのHogeを選択してください。staticでは受信したデータが反映されません。

スクリーンショット 2021-06-26 152647

サーバ側の設定はこれで完了です。

2. クライアント側

サーバ側と同じようにプロジェクトにOscCoreのパッケージをインポートしてください。インポートが完了したら、以下のスクリプトを適当なオブジェクトにアタッチします。IPアドレスはサーバのアドレスを設定します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using OscCore;

public class ClientExample : MonoBehaviour
{
   OscClient client = new OscClient("サーバIPアドレス", 9000);

   void Update() {
       if (Input.GetKeyDown(KeyCode.A)) {
           Debug.Log("Send");
           client.Send("/hoge", 1.0f);
       }
   }
}

3. 実行

サーバとクライアントを実行し、クライアント側で「a」キーを押してメッセージを送信してみてください。サーバ側のConsoleで数値が表示されれば成功です。

スクリーンショット 2021-06-26 154933

4. 注意点

Windows環境でメッセージが表示されない場合は、ファイヤーウォールの設定で指定ポートが開放されていないか、または使用しているUnityエディタのパブリック接続がブロックされている可能性があります。

Unityエディタがパブリック接続可能かどうかは、Windowsのファイヤーウォール設定から、使用しているUnityエディタのバージョンをダブルクリックしプロパティを開くことで確認することができます。

無題_New

まず「全般」タブの操作で「接続をブロックする」にチェックが入っている場合は「接続を許可する」にチェックを入れます。

無題_New

次に「詳細設定」タブからパブリックにチェックが入っているかどうかを確認し、入っていなければチェックを入れて[適用]ボタンを押します。

無題2_New

5. おわりに

OSCは通信規格として、様々なソフトウェアや機材が対応していることも多く、リアルタイムにUnityで処理する用途としては意外と多いと思います。最後に、スマートフォンから色情報をリアルタイムに送っている様子を動画ににしました。是非、みなさんもOSCによるリアルタイム制御を楽しんでみてください。🌱



いいなと思ったら応援しよう!