Raspberry PiにNode.jsをインストールし、Raspberry Piとパソコンで動作しているUnity間で、WebSocket通信を使用して、リアルタイムで情報を転送します。
Node.jsは、サーバーサイドJavaScriptとも呼ばれ、サーバ側もJavaScriptで記述できるのが大きな特徴です。
WebSocketは、wsモジュールを実装します。wsモジュールは、WebSocketプロトコル(RFC-6455に準拠する)の実装ライブラリです。socket.ioのように多機能ではありませんが、シンプルな作りで非常に高速に動作するのが特徴です。 Node.js 側では socket.io の代わりに ws を使って、 Unityでwebsocket-sharp により通信します。

動作環境

  • Unity ver4.5
  • Windows7 professional

Raspberry PiへのWebSocketサーバ側のインストール

Raspberry PiをWebSocket通信のサーバ側にするために、Node.jsをインストールします。Node.jsをインストールする手順は「Raspberry PiにNode.jsのインストール 」を参照してください。

次に、npm(node package manager)を利用してwsをインストールします。作業用のフォルダ(ここではnode_modulesとします)を作成し、ここで次のコマンドを実行して、wsをインストールします。

$ cd /home/common/motion/node_modules
$ npm install ws
-
> utf-8-validate@1.1.0 install /home/pi/node_modules/ws/node_modules/utf-8-validate
> node-gyp rebuild

make: Entering directory '/home/pi/node_modules/ws/node_modules/utf-8-validate/build'
  CXX(target) Release/obj.target/validation/src/validation.o
  SOLINK_MODULE(target) Release/obj.target/validation.node
  COPY Release/validation.node
make: Leaving directory '/home/pi/node_modules/ws/node_modules/utf-8-validate/build'

> bufferutil@1.1.0 install /home/pi/node_modules/ws/node_modules/bufferutil
> node-gyp rebuild

make: Entering directory '/home/pi/node_modules/ws/node_modules/bufferutil/build'
  CXX(target) Release/obj.target/bufferutil/src/bufferutil.o
  SOLINK_MODULE(target) Release/obj.target/bufferutil.node
  COPY Release/bufferutil.node
make: Leaving directory '/home/pi/node_modules/ws/node_modules/bufferutil/build'
ws@0.7.2 ws
--- options@0.0.6
--- ultron@1.0.2
--- utf-8-validate@1.1.0 (bindings@1.2.1, nan@1.8.4)
--- bufferutil@1.1.0 (bindings@1.2.1, nan@1.8.4)

websocket-sharp のwebsocket-sharp.dllの作成

次の手順で、websocket-sharpのC# コードをgithubからダウンロードし、MonoDevelopでダウンロードしたwebsocket-sharpをコンパイルして、websocket-sharp.dllを作成します。作成したwebsocket-sharp.dllは、UnityのAssetsのPluginとして保存します。これで、GameObjectにアタッチしたスクリプトから呼び出すことができます。

まず、次のgithubよりwebsocket-sharpのC#ソースをダウンロードします。
https://github.com/sta/websocket-sharp.git

つぎに、MonoDevelopを起動します。Unityをインストールすると次のディレクトリにMonoDevelopがすでにインストールされています。ショートカット「MonoDevelop」をクリックして、MonoDevelopを起動します。

C:\Program Files\Unity\MonoDevelop

画面が表示されるとメニューバーから、「file」→「Open」を選択すると、次の画面が表示されます。

MonoDevelopプロジェクトファイルのインポート

ここで、プルダウンメニューの「Project Files」を選択し、ダウンロードしたwebsocket-sharpのプロジェクトファイル「websocket-sharp.csproj」を選択します。websocket-sharpが読み込まれるので、次にwebsocket-sharpをコンパイルしてwebsocket-sharp.dllを作成します。メニューバーから、「Build」→「Rebuild All」を選択すると、コンパイルが開始され、「/websocket-sharp/bin/Debug/」にwebsocket-sharp.dllが作成されます。

作成したwebsocket-sharp.dllをUnityで使用できるように、Unityの画面からProjectのAssetsにPluginsのFolderを作成して、このFolderに作成したwebsocket-sharp.dllをimportします。importするには、Assetsの表示領域で右クリックし、「Import New Assets」を選択します。

Raspberry Piサーバー側スクリプト

Raspberry Piで実行されるNode.js用のスクリプトファイル「server.js」を作成します。

server.js

var WebSocketServer = require('ws').Server
, wss = new WebSocketServer({port: 8124});
wss.on('connection', function(ws) {
  ws.on('message', function(message) {
  console.log('received: %s', message);
});
ws.send('something');
});

Unityクライアント側スクリプトの作成

以下のようなC#で記述されたスクリプトを、Unityで作成した適当なGameObjectにアタッチします。

using UnityEngine;
using System.Collections;
using WebSocketSharp;

public class q1 : MonoBehaviour {
    private WebSocket ws;
	// Use this for initialization
	void Start () {
	}
	
	// Update is called once per frame
	void Update () {
		rigidbody.MovePosition (new Vector3(Mathf.Sin(Time.time),0,0));

        this.ws = new WebSocket("ws://127.0.0.1:8124");
        this.ws.OnMessage += (object sender, MessageEventArgs e) =>
        {
            print(e.Data);
        };
        this.ws.Connect();
    }
}

WebSocket通信の動作確認

Raspberry Piから次のコマンドの実行で、WebSocket用サーバーを立てます。

$ node server.js

パソコン側で、作成したスクリプトをアタッチしたUnityのGameObjectを再生すると、次のようにConsoleに「something」が表示され、WebSocket通信により、UnityとRaspberry Pi間でデータが転送されていることが確認でます。

WebSocket通信を行ったUnity画面