【Unity】OscJackでOSC通信する
前回はOscCoreを使ったOSC通信の解説を行いましたが、今回はUnity使いであれば知る人ぞ知るkeijiro氏のOscJackを使ってOSC通信を行ってみたいと思います。
1. OscJack
READMEによるとUnityへのインストールは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パネルのPackagesを展開して「OSC Jack」があるか確認します。
2. サーバ側
クライアントからメッセージを受信したときに行う処理を記述します。以下のスクリプトは受信したメッセージをコンソールに表示します。
using UnityEngine;
public class ServerExample : MonoBehaviour
{
public void OnMessage(float value) {
Debug.Log(value);
}
}
次にシーン上に適当なオブジェクトを配置し、OscJackの「Event Receiver」コンポーネントと作成したスクリプトをアタッチします。
「Event Receiver」の設定を以下のようにします。
・UDP Port Number:メッセージを受信するポート番号
・OSC Address:任意のアドレスパス
・Data Type:Float (今回はfloat型のメッセージを送るため)
・Float Event (Single):受信時のスクリプト
Float Eventは作成したスクリプトをドラッグアンドドロップし、実行するメソッドとしてOnMessageを設定します。このときのメソッドはStatic ParametersではなくDynamic floatの方を指定します。
3. クライアント側
以下のスクリプトを適当なオブジェクトにアタッチします。
using UnityEngine;
using OscJack;
public class ClientExample : MonoBehaviour
{
OscClient client = new OscClient("サーバのIPアドレス", 9000);
void Update() {
if (Input.GetKeyDown(KeyCode.S)) {
Debug.Log("Send");
client.Send("/unity", 1.0f);
}
}
private void OnDestroy() {
client.Dispose();
}
}
内容としては「s」キーを押すたびにサーバへメッセージ(数値)を送ります。
4. 実行
サーバとクライアントをそれぞれ実行し、クライアント側で「s」キーを押してサーバ側のコンソールに数値が表示されれば成功です。
もし、Windows上でうまくいかない場合はファイヤーウォールの設定で指定ポートが開放されていないか、または使用しているUnityエディタのパブリック接続がブロックされている可能性があります。
Unityエディタがパブリック接続可能かどうかは、Windowsのファイヤーウォール設定から、使用しているUnityエディタのバージョンをダブルクリックしプロパティを開くことで確認することができます。
まず「全般」タブの操作で「接続をブロックする」にチェックが入っている場合は「接続を許可する」にチェックを入れます。
次に「詳細設定」タブからパブリックにチェックが入っているかどうかを確認し、入っていなければチェックを入れて[適用]ボタンを押します。
5. おわりに
クライアント側の処理はコンポーネントを使用せずにスクリプトで直接記述しましたが、サーバ側も同様にスクリプトのみで記述可能なようなので規模が大きくなる場合はスクリプトで実装する方が効率が良いかもしれません。
OscJackは使用例も多く、簡単に扱えることからもおすすめのOSCライブラリといえそうです。是非、みなさんもOSC通信によるリアルタイム処理を楽しんでみてください。そしてOscJackを制作したkeijiro氏に感謝いたします。🌱