UnityでiOSでもAndroidでもSocket.IOでリアルタイム通信
僕は別にアプリエンジニアじゃなかったんだけど、やらないといけなくなり、検証したのでメモ。
(Node.jsはv0.10.28、Socket.IOは0.9.17、Unityは4.3.4、iOSは7.1.2、Androidは4.4.2で検証)
スマホでSocket.IOを使いたい場合、ネイティブではこの辺のライブラリを使うと思う。
https://github.com/pkyeck/socket.IO-objc
https://github.com/Gottox/socket.io-java-client
ネイティブプラグインはよくわからなかったのでC#で書いてiOS,Android両方で使えるのはないかなと思っていたら
https://github.com/NetEase/UnitySocketIO
これが見つかった。他にはあまりなさそう。
で、一個問題があって、iOSだとEXC_BAD_ACCESSやら--aot-onlyと言われてうまく動かない。
SimpleJson.dllが古い、かつiOSでは使えないオプションが付いていたみたいなので、
SimpleJsonを自分でビルドし直した。
SimpleJson.csで#define SIMPLE_JSON_NO_LINQ_EXPRESSION
をアンコメントする必要がある。
ここが参考になった。
https://github.com/kaistseo/UnitySocketIO-WebSocketSharp
こっち使ってもよかったかも。
まあどちらにしてもSocket.IOといいつつWebSocketしか使えないし、1.0系に対応するかどうかはよくわからない。。
ちなみにDLLを更新した版はフォークしてここに置いた。
https://github.com/take4/UnitySocketIO
C#のサンプルコード※サーバー側はよくあるサンプルチャットなので割愛。
using UnityEngine; using System.Collections; using System.Collections.Generic; public class NewBehaviourScript : MonoBehaviour { public GUIText text1; public string text = ""; SocketIOClient.Client socket; // Use this for initialization void Start () { Debug.Log ("start"); socket = new SocketIOClient.Client ("http://xxx.xxx.xxx.xxx:3000/"); socket.On ("connect", (fn) => { Debug.Log("connect - socket"); }); socket.On ("message:receive", (data) => { Debug.Log(data.Json.ToJsonString()); text = data.Json.ToJsonString() + "\n" + text; }); socket.Connect(); } // Update is called once per frame void Update () { text1.text = text; } void OnGUI() { if (GUI.Button( new Rect (30, 30, 120, 50), "PUSH")) { Dictionary<string, string> args = new Dictionary<string, string>(); args.Add("message", "YO"); socket.Emit("message:send", args); } } }
追記
やっぱりこっちを使ったほうがよさげ
https://github.com/kaistseo/UnitySocketIO-WebSocketSharp
https://github.com/KLab/websocket-unitymobile