electronとUnityをOSCで繋いでみた
はじめに
やりたいことは、 electron と Unity を OSC で通信をしてみる。
electron
まずは、 node.js で使える OSCモジュールを探しました。
わりと、この手のモジュールを書いてる人が結構いて、どれを使えばいいのか迷いましたが、そういえば、トモダチが書いていたのを思い出し
hrfm/node-oscsocket - JavaScript
こちらを使わせてもらうことにしました。
使い方はとても簡単で直感的です。
sender(OSCを送信する側)
const sock = new osc.OSCSocket();
let msg = new osc.OSCMessage();
msg.address = '/osc/from/electron';
msg.addArgument('i', 100);
msg.addArgument('s', 'String value.');
sock.send(msg, 6666, '127.0.0.1');
listener(OSCを受信する側)
let socket = new osc.OSCSocket();
socket.bind({
port: 5555,
address: '127.0.0.1'
});
socket.on('/osc/from/unity', (message) => {
console.log('/osc/from/unity');
console.log(message);
this.setState({
message: JSON.stringify(message)
});
});
webpack 経由だと node.js のコアモジュールにアクセスできない問題
以下のリンクにあるように、webpack などの browserify 経由で bundle するとコアモジュールにアクセスできないので、
index.html に直接 require でグローバル変数に入れています。
Resolving in node_modules · Issue #9 · webpack/coffee-loader
Cannot resolve module ‘fs’ · Issue #8 · webpack/jade-loader
Webpack issue with node libraries · Issue #29 · kriasoft/react-starter-kit
<script>
window.osc = require('oscsocket');
</script>
サンプルリポジトリ
hisasann/electron-osc: OSC communication sample on the electron.
Unity
Unity 側での OSC 通信をサポートするライブラリは以下を使いました。
ググると、わりとこちらを使っている人が多いので、 最終コミットはかなり前ですが、採用!
jorgegarcia/UnityOSC: Open Sound Control (OSC) C# classes interface for the Unity3d game engine
src 以下を Unity のプロジェクトに import or drag and drop して、セットアップします。
OSCController.cs ファイルを作成し、適当な GameObject にアタッチします。
こちらが、送信、受信のサンプルです。
↑の gif ではキューブを適当な数表示しているので、その出し方とかは、リポジトリの参照をお願いします。
unity-osc/OSCController.cs at master · hisasann/unity-osc
UnityOSC/src の中にある OSCHandler.cs の一部を書き換えます。
CreateServer の第一引数は electron 側の文字列と合わせる必要があります。
public void Init()
{
//Initialize OSC clients (transmitters)
//Example:
CreateClient("UnityOSC", IPAddress.Parse("127.0.0.1"), 5555);
//Initialize OSC servers (listeners)
//Example:
CreateServer("/osc/from/electron", 6666);
}
雑感
実際に http で開かれるサイトで OSC 通信をするには、さらに WebSocket などで補強しないといけないですが、 electron は file:// で開かれるので、
node.js のコアモジュールに直接アクセスできるので便利ですね。(ちょっと慎重にしないといけないですが)
今回は、 electron と Unity を OSC で繋ぐところまでやりましたが、次回は、 electron でクリックした座標を Unity 側でキャリブレーションしてクリックされた座標に何か出してみたいと思います。
参考リンク
「天才けんけんぱ」:Unityとセンサーの連携(2/4) - 1ビットの孤独
( ・∀・)イイ!!