こちらのUnity 3.4で追加されたジャイロを使ったサンプルプログラムの動画でOSC(OpenSound Control)が使われているのを見て、「そう言えばUnityでOSCを使った様な動画見かけたなぁ」「前回参加したGame hack-a-thon #4でUnityでOSC使ってた人いたなぁ」というのを思い出し、それをきっかにUnityでOSCを使う方法を調べてみる事にしました。
サンプルを探す
検索してみた所、フォーラムのこちらにてサンプルコードを公開されている方を見つけました。
MIDI or OSC for Unity Indie users?
http://forum.unity3d.com/threads/16882-MIDI-or-OSC-for-Unity-Indie-users
沢山のソースコードが公開されていますが今回は unityosc3_753.zip というサンプルを使いました。
usingの部分でエラーが出ていましたがこちらのブログを参考に using System.IO; に変更した所、無事実行できました。
SuperCollider + Unity3d - sc3onlinuxの日記
http://d.hatena.ne.jp/sc3onlinux/20110528/1306573637
OSCのコントローラ用のアプリを探す
今回、コントローラはiPhoneを使おうと思ったのでOSCアプリを検索。こちらでいくつか紹介されていました。
iPhoneをリモコンにしてみる(2/4)- @IT
http://www.atmarkit.co.jp/fsmart/articles/input01/02.html
こちらのページや他のサイトなどを見ていると有料ですが TouchOSC というアプリが評判が良さそうなのでこちらを購入しました。もちろん、他のアプリでも操作出来るかと思いますが今回はこちらのアプリを使った場合の使い方の解説となります。
OSCがやり取りしているデータをチェックする方法を探す
自分はOSCは名前知っているけど一切使った事が無い状態でした。
まずはOSCがどの様なデータをやり取りするのかをチェックする事にしました。
チェックに使える無料のOSCアプリなどが有ったら良かったのですが見つからなかった為にProcessingで出来ないか調べてみました。
実はそれが前回のエントリーの元ネタだったります。
ProcessingでOSC(OpenSound Control)を使う方法 - 強火で進め
http://d.hatena.ne.jp/nakamura001/20110807/1312725476
TouchOSCの設定方法
Processing側の話の前にTouchOSCの設定方法について簡単に説明しておきます。
TouchOSCを起動するとこの様な画面が表示されます。OSCの部分で接続先の設定を行います。
今回はMacとTouchOSC間でアクセスする為、Macで現在のIPをこちらで紹介されている様な方法で取得(まぁ、ターミナルで ifconfig コマンドで確認しても良いですが…)し、「HOST」に記述します。
TouchOSCのインターフェイスは色々なものが使えますが今回は「Beatmachine」を使いました。
右上の「Done」ボタンを押すとコントローラが表示されます。
OSCがやり取りしているデータをチェック
ProcessingでoscP5というライブラリをインストール後、付属の oscP5sendReceive.pde というサンプルでデータのチェックしました。
TouchOSC で適当にボタンを押すと以下の様なデータが送られているのが確認出来ました。
### received an osc message. addrpattern: /1/recenable typetag: f ### received an osc message. addrpattern: /1/recenable typetag: f ### received an osc message. addrpattern: /1/input typetag: f ### received an osc message. addrpattern: /1/input typetag: f ### received an osc message. addrpattern: /1/solo typetag: f ### received an osc message. addrpattern: /1/solo typetag: f
Unityのサンプルの設定
自分がUnityでOSCを使うのはTouchOSCをコントローラにしてUnity上のオブジェクトを操作する様なシチュエーションを想定しているのでシーンビューの OSCEmpty にデフォルトで設定されている OSCTestSender.cs を削除し、代わりに OSCReceiver.js を追加して以下の様な構成にしました。
Inspectorの OSCReceiver (Script) の「Remote IP」にはTouchOSCの「HOST」に設定したのと同じIPを指定。「Send To Port」「Listener Port」はそれぞれTouchOSCの「Port (incoming) 」と「Port (outgoing) 」の値を設定します。
UnityのサンプルでProcessingで確認した様なデータと同様な記述が有るのは OSCReceiver.js の以下の記述でした。
handler.SetAddressHandler("/1/toggle1", Example1); handler.SetAddressHandler("/1/toggle2", Example2);
メソッドの内容を確認した所、 /1/toggle1 などに送られたデータを処理するメソッドを Example1 と指定している様です。
ここで指定されている /1/toggle1 や /1/toggle2 はTouchOSCでは左上のココに割り当てられていました。
上が toggle1 下が toggle2 です。
プログラムを実行してこれらのボタンをタップするとUnityのConsoleにてデータを受け取っている事が確認出来ました。