はじめに
Unityの映像をTouchDesignerやOFなどにリアルタイムで転送させたい。
要はVJみたいなこと。しかも、Win/Mac両方で。
どうやるか?
WindowsだとSpout、MacではSyphonが有名。
ただ、Win/Mac両方で〜となると、SpoutとSyhonの入れ替えが必要。
入れ替えるの面倒くさい。。。
ということで、OS判定で切り替わる SpoutSyphon という仕組みを作りました。
少し解説
Unity用のSpoutはこちらが解説が詳しいです。
TouchDesignerでの受信方法も書いてあります。
Unity Japanのkeijiroさんが素晴らしいUnity用プラグインを公開されているので、それをOS判定で切り替えます。詳しいインストール手順はSpoutSyphonのReadMeをご覧ください。
用語の統一
SpoutSyphonを作るにあたって、用語をSpoutのものに統一しました。
送信側をSender、受信側をReceiver としました。
(Syphonではそれぞれ ServerとClient)
機能の統一
機能も統一しました。こちらは2つの良いとこどりをしています。
キャプチャモード
キャプチャモードとして、CameraCaptureMode と RenderTextureMode がありますが、KlakSyphonではMetalとの相性のため RenderTextureMode が使えません(2021年5月現在)。明示的にするため、SpoutSyphonではCameraCaptureModeのみサポートしています。
Senderセレクター
KlakSpoutはUnityEditor上の機能が充実していて、Senderを選択するセレクターがあります。
SpoutSyphonでは、ランタイム上にプルダウンメニューのセレクターを表示するようにしました。
SenderName
SpoutSyphonでは、Syphonの命名規則を取り入れ**「AppName:SenderName」**となります。
(通常のSpoutでは「AppName」は付かない)
UnityEditor上で再生している場合は、**「Unity:SenderName」**となります。
これにより、SenderNameの重複を避けやすくなります。また、もしフルSenderNameが重複した場合は受信できなくなるので、エラーログを出すようにしました。
拡張した機能
より使いやすくするために。
解像度の指定
フレームレートを安定させるために、Sender/Receiverの解像度を変えたいことがあります。
SpoutSyphonでは、インスペクターで解像度を指定できるようにしました。指定した解像度のレンダーテクスチャーは自動生成されるので、あらかじめレンダーテクスチャーを用意しなくてよくなりました。
AutoConnect
SpoutSyphonでは、**Receiverで指定したSenderNameに自動接続します。**この時、AppNameは評価しません。通常、ReceiverからPullする必要がありますが、AutoConnectをOnにすると接続するまでポーリングし続けるので、SenderからPushすることが可能です。
おわりに
元々は、Spout用に作った AutoConnect 機能をSyphonに移植しようとしたのが始まりでした。結果として、クロスプラットフォーム化することで、今後も拡張機能を追加しやすい仕組みになったと思います。
また、SpoutSyphonのスクリプトをアタッチするだけで使えるようになっているので、WinだけMacだけの人にもオススメです。
使ってみた感想などをいただけると励みになります。