TKC Works

ギジュツ的なメモ、読書感想文など

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);

        }
    }
}

f:id:take4kamada:20140711160943p:plain

追記

やっぱりこっちを使ったほうがよさげ
https://github.com/kaistseo/UnitySocketIO-WebSocketSharp https://github.com/KLab/websocket-unitymobile