UnityでWebSocketを使用する



## 1. C# WebSocketライブラリのダウンロード

使用するライブラリ
websocket-sharp
https://github.com/sta/websocket-sharp

websocket-sharpのgithubページに移動し、ファイルをダウンロード

![スクリーンショット 2015-11-05 17.40.50-01.png](https://qiita-image-store.s3.amazonaws.com/0/35267/bacb0b08-74b3-e7fe-8ea6-569a65cf004e.png)


## 2. C# WebSocketライブラリのビルド

Macの場合、
websocket-sharpフォルダ内の
**websocket-sharp.sln**ファイルをダブルクリックする。

![ws_000.png](https://qiita-image-store.s3.amazonaws.com/0/35267/410ba345-59b3-35ed-bed9-a1f313e1b97f.png)

### ① websocket-sharpソリューションファイルを開く

Unityをインストールして.slnファイルの扱いについての何も設定を行っていなければ、MonoDevelopが立ち上がります。
ビルドにはMonoDevelopを使用することにします。


### ② 不要なプロジェクトの削除
このままビルドすると、サブプロジェクトであるExampleXXプロジェクト部分でエラーが出力されるので、それらをソリューションから削除しておきます。（実際、エラーは気にしなくても大丈夫です）

メニューから **メニュー>Visual Design**を選択し、サイドバーにプロジェクト一覧を表示

**Example, Example1, Example2, Example3**を選択し、

右のツールボタンから、**削除**を選択
**Remove**をクリック

![スクリーンショット 2015-11-05 19.13.57.png](https://qiita-image-store.s3.amazonaws.com/0/35267/79f923bb-c2f7-d8c0-1435-f9d453c17c48.png)


### ③ ビルド方法を**Release**に変更

### ④ メニューから **ビルド>全てをビルド** を実行

ビルドに成功すると、
websocket-sharp/bin/ ディレクトリに、Release/**websocket-sharp.dll** ファイルが作成されます。
![ws_001.png](https://qiita-image-store.s3.amazonaws.com/0/35267/df12ea19-a2a5-c3c1-19e1-aa23ac0bdde7.png)

## 3. Unityにwebsocket-sharpライブラリを読み込む
先ほどビルドした websocket-sharp.dllファイルを Assets直下にPluginsフォルダを作り、その下に置きます。
![スクリーンショット 2015-11-05 18.12.22.png](https://qiita-image-store.s3.amazonaws.com/0/35267/4841c744-3548-d8b0-299e-a505a05fc49f.png)

## 4. サンプルコード
### ① クライアント (Unity)

シンプルなWebSocketクライアントプログラムです。
変数 **WSAddress** には接続先のWebSocketサーバアドレスを記述します。
スペースキーを押すと、*Test Message* というWebSocketメッセージを送信します。

```csharp:ClientExample.cs
using UnityEngine;
using System.Collections;
using WebSocketSharp;
using WebSocketSharp.Net;

public class ClientExample: MonoBehaviour {

    WebSocket ws;

    void Start()
    {
        ws = new WebSocket("ws://localhost:3000/");

        ws.OnOpen += (sender, e) =>
        {
            Debug.Log("WebSocket Open");
        };

        ws.OnMessage += (sender, e) =>
        {
            Debug.Log("WebSocket Message Type: " + e.Type + ", Data: " + e.Data);
        };

        ws.OnError += (sender, e) =>
        {
            Debug.Log("WebSocket Error Message: " + e.Message);
        };

        ws.OnClose += (sender, e) =>
        {
            Debug.Log("WebSocket Close");
        };

        ws.Connect();

	}
	
	void Update()
    {
	    
        if (Input.GetKeyUp("s"))
        {
            ws.Send("Test Message");
        }

	}

    void OnDestroy()
    {
        ws.Close();
        ws = null;
    }
}
```

### ② サーバーサイド (Unity)
ポート3000番で、メッセージが来たらそのままそのメッセージをブロードキャストするシンプルなサーバープログラムです。

```csharp:ServerExample.cs
using UnityEngine;
using System.Collections;
using WebSocketSharp;
using WebSocketSharp.Net;
using WebSocketSharp.Server;

public class ServerExample: MonoBehaviour {

    WebSocketServer server;

    void Start ()
    {
        server = new WebSocketServer(3000);

        server.AddWebSocketService<Echo>("/");
        server.Start();
        
	}
	
	void OnDestroy()
    {
        server.Stop();
        server = null;
    }

}

public class Echo : WebSocketBehavior
{
    protected override void OnMessage (MessageEventArgs e)
    {
        Sessions.Broadcast(e.Data);
    }
}
```

### (補足) サーバーサイド (Node.js)
ポート3000番で、メッセージが来たらそのままそのメッセージをブロードキャストするシンプルなNode.jsサーバープログラムです。


```js:sever.js
var ws   = require ('ws').Server;

var wss = new ws ({port: 3000});


wss.broadcast = function (data) {
	for (var i in this.clients) {
		this.clients [i].send (data);
	}
};

wss.on ('connection', function (ws) {
	ws.on ('message', function (message) {
		var now = new Date();
		console.log (now.toLocaleString() + ' Received: %s', message);
		wss.broadcast (message);
	});
});
```