UE4×WebSocket(UEWebsocketプラグイン編)

UnrealEngine4でWebSocketに接続してみましょう。
今回は有志が開発したプラグインを利用します。

#UEWebsocketプラグイン
UnreanEngineには簡単にWebSocketに接続できる、有志が開発したプラグインがあります。

今回はその一つ、UEWebsocketプラグインを使用します。
https://github.com/feixuwu/UEWebsocket

こちらのプラグインを利用して、ローカルにWebSocketサーバーを立ててUE4で接続してみましょう。

##検証環境

以下の環境で検証しました。

・OS:Windows7
・サーバー：Node.js v8.4.0
・クライアント:UnrealEngine4.17.1

##サーバー環境

[こちらのサイト](http://ishiduca.hatenablog.com/entry/2012/04/20/102437)からサーバーソースをお借りしました。
検証にWebSocketサーバーが欲しいだけなので、このサイトの記載通りにNode.jsをインストールして環境を設立し、サーバーソース(app.js)をそのまま利用しています。
詳しく知りたい人は、[サイト先](http://ishiduca.hatenablog.com/entry/2012/04/20/102437)を見てください。

JavaScriptの作成が終わったら、Node.jsのコマンドプロンプトを叩いて、サーバーソース(app.js)を起動させます。

起動に成功すれば、以下の画像の通りServer Start on post-〇〇〇〇-とコメントが出てきます。
![サーバーログ.png](https://qiita-image-store.s3.amazonaws.com/0/104377/b72c0435-be6a-4102-9414-f21e2208a3f3.png)

※一通りつないだ後にスクリーンショットを撮った為、余計なログが出ていることをご了承ください。

##UE4実装(クライアント環境)

プラグイン側のUE4側の実装を記載します。

![git.png](https://qiita-image-store.s3.amazonaws.com/0/104377/22ca597d-21f3-1d5b-e928-fcfa7cfbe224.png)

まず、[UEWebsocket](https://github.com/feixuwu/UEWebsocket)をダウンロードします。
Gitでクローンするか、zipをダウンロードするかはお好みで。

プラグインのダウンロードが終わったら、UE4のプロジェクトフォルダにUEWebsocketの「Plugins」フォルダをコピー＆ペーストをします。
![フォルダ.png](https://qiita-image-store.s3.amazonaws.com/0/104377/05b33e79-8ae9-7286-fe44-2af2715aff32.png)
↓
![プロジェクト.png](https://qiita-image-store.s3.amazonaws.com/0/104377/bfed6445-f495-f530-a3c3-70993a30065c.png)

2017/9/6時点でプラグインはバージョンが4.15以下しか対応してないため、4.16以上ではプラグインのビルドが必要です。
プラグインのビルドはalweiさんの[UE4 プラグインを自分でビルドしてみる](http://unrealengine.hatenablog.com/entry/2015/05/20/220000)に詳しく書かれているため、そちらをご覧ください。
もしわからない場合は、検索サイトで「UE4 プラグイン　ビルド」と検索すれば他にもたくさんビルド手順が書かれたブログが出てきます。

---

プラグインのビルドが成功したら、UE4のブループリントで実装してしまいましょう。

以下の画像は一通り接続が済んだBPクラスです
![websocket.png](https://qiita-image-store.s3.amazonaws.com/0/104377/05d3ede8-aa44-72a9-ad96-ff165e971c8c.png)

これだけでWebSocketを利用したチャットのシステムが簡単にできます。
重要なノードを拡大して簡単に解説します。

###WebSocket接続

WebSocketに接続するためにConnectノードを使用します。
![image1.png](https://qiita-image-store.s3.amazonaws.com/0/104377/b66cb282-aa9b-bf7b-e19c-45cee114a202.png)

UrlにWebSocketのアドレスを入力しましょう。今回はローカルなので「ws://localhost:8080/websocket」と入力しています。
戻り値がWebSocketBaseオブジェクトです。この型はUEWebsocketプラグインのオリジナルです。
この戻り値は接続が切れるまで絶対に必要なので、必ずConnectノードの戻り値を参照するような処理に必ず『戻り値のWebSocketBaseオブジェクト』を参照するように実装してください。

今回の場合はただの検証のため、WebSocketBaseオブジェクトを変数として保持する仕組みになっています。

###イベントディスパッチャー登録

Connectノード使用後、WebSocketを実装する上で必要なイベントディスパッチャーを登録していきます。
UEWebsocketは受信、接続判定のノードは全てイベントディスパッチャーを利用したコールバック形式のため、カスタムイベントの作成が必要です。
各WebSocket関連のイベントディスパッチャーには、WebSocketBaseオブジェクトが引数として設定されているため、必ずConnectノードの戻り値であるWebSocketBaseオブジェクトを使用してください。

####接続成功イベント

WebSocketサーバーへの接続が成功したら、OnConnectCompleteイベントの通知が来るので、イベントをバインドします。
![image4.png](https://qiita-image-store.s3.amazonaws.com/0/104377/edbcd39d-8864-65aa-fd68-77653c577ae8.png)

####接続失敗イベント

WebSocketサーバーへの接続に失敗したら、OnConnectErrorイベントの通知が来るので、イベントをバインドします。
![image5.png](https://qiita-image-store.s3.amazonaws.com/0/104377/0e5e9e5f-86e7-e0dd-d275-bbf0387d7166.png)

####接続終了イベント

WebSocketサーバーの接続を閉じたら、OnClosedイベント通知が来るので、イベントをバインドします。
![image7.png](https://qiita-image-store.s3.amazonaws.com/0/104377/5950f0d2-0afb-d850-40e1-603a81f5dfde.png)

接続を終了したら、各イベントディスパッチャーの割り当てを削除するのがオススメです。

####受信イベント

WebSocketサーバーから文字列を受信したら、OnReceiveDataイベント通知が来るので、イベントをバインドします。
カスタムイベントにはStringを引数にセットする必要があります。
![image6.png](https://qiita-image-store.s3.amazonaws.com/0/104377/db2c95a2-222c-e8e2-5fd2-c7b13423abfa.png)

###メッセージ送信

メッセージを送信する場合はSendTextノードを利用します。
WebSocketBaseオブジェクトが引数として設定されているため、必ずConnectノードの戻り値であるWebSocketBaseオブジェクトを使用してください。
送りたい文字列をDataに入れます。
![image2.png](https://qiita-image-store.s3.amazonaws.com/0/104377/b7e022c0-0d68-6355-6685-ab042da0513b.png)

###WebSocketサーバー接続を終了する

WebSocketサーバー接続を終了する場合はCloseノードを使用します。
WebSocketBaseオブジェクトが引数として設定されているため、必ずConnectノードの戻り値であるWebSocketBaseオブジェクトを使用してください。
このノード使用後、正常にWebSocketサーバーの接続が終了した場合、OnClosedイベントが通知されます。
![image3.png](https://qiita-image-store.s3.amazonaws.com/0/104377/6fdd7bfc-3b02-44ca-fb06-99617cf294ed.png)

---

ノードの説明は以上です。これらを利用すればチャット等は簡単に実装できます。
無事接続に成功すると、サーバーログがこのように出力されます。こうなれば成功です。
![サーバーログ１.png](https://qiita-image-store.s3.amazonaws.com/0/104377/b1080853-3f92-0988-a187-f81f99a2aa98.png)

#まとめ

極めて簡単にWebSocketに接続できました。正直、UE4でここまで簡単に接続できるとは思いませんでした。
ブループリントでWebSocketに接続できれば、視覚的に処理がわかりやすいというのが凄い利点だなーと思いました。
JSONへの変換ノードも用意されているので、JSONでWebSocketのやり取りも行うことも可能です。

ただ、このプラグインではbyteデータはデフォルトで対応されてないため、byteデータの送受信が必要な場合はプラグインソースを修正する必要があります。

チャットなどちょっとした処理でWebSocketサーバーを利用したい場合、とても役に立つプラグインなので是非利用してみてください。