littlewing

人間とコンピューターとメディアの接点をデザインするために考えたこと

Unity5 + iOS でWebsocketとnode.js連携を試してみる

photo by Kyle McDonald

Unity iOSアプリでWebSocketを使いたくてライブラリをいろいろ探しました。

Editor上では動くのに端末で動かないライブラリもあり、いろいろ試したメモ。

環境・前提

  • Unity 5.2.0f3 (onMac)
  • Unity/Android/iOS Proライセンス取得済み
  • 有料Assetはなるべく使いたくない(手続きが面倒な環境のため)
  • iOSは8.3.3

途中結果

[1]node.js wsとの接続

現状では、iOS実機上で無料Assetの

が動作しています。

Socket.IO for Unityはライブラリの一部(JsonObjects for Unity)がLGPL2.1なので商用を視野に入れるとできれば避けたい。

ということで、ひとまず、UniWeb-Freeが良い感じ。

けど、切断(Close)とかにちょっと不安が、、 引き続き調べようかな

[2]node.js socket.ioとの接続

  • GitHub上のunity-socket.ioが今のところ、node.jsのsocket.io1.3.7と接続できています。

  • AssetのSocket.IO for Unityと同じ人が作っているみたい、、

  • 同じくJsonObjectが同梱されていてLGPLです。


試した内容

判例 説明
実際に動いた
ドキュメントを見る限り動く
試した限りではiOSで動かせなかった(本当は動くかも)
Pro Proライセンスが必要と明記されている

on Asset Store

タイトル 値段 ライセンス require Unity5 Editor iOS Android
◎UniWeb-Free free ? 5.1 ◎Pro ○Pro
UniWeb $25 see 4.6.5- ○Pro Pro
WebSocket for desktop and mobile $35 Apache License, 2.0 4.6.1-
Socket.IO for Unity free MIT +LGPL2.1 4.5.3- ◎Pro ○Pro
WebSocket-Sharp for Unity $15 ? 4.1.3- ? ○Pro ○Pro

on GitHub

タイトル 値段 ライセンス require Unity5 Editor iOS Android
UnitySocketIO free MIT ? see ?
websocket-sharp free MIT 4.1.3- see
unity-socket.io free MIT ? see ?

etc

タイトル 値段 ライセンス require Unity5 Editor iOS Android
WebSockets.unitypackage free ? ? see ?

node.js側のサーバーのコード

参考までに

wsを利用したテストの場合

var ws = require('ws').Server;

var server = new ws({ port: 6666 });
server.on('connection', function(ws) {

   console.log('connected!');
    ws.on('message', function(message) {
        console.log(message.toString());
    });
    ws.on('close', function() {
           console.log('disconnected...');
    });
    setInterval(function() {
        ws.send("Hi!");
    }, 1000);
});

socket.io最新版(1.3.7)を利用したテストの場合

var io = require("socket.io")();

io.on("connection", function (socket) {
    console.log("online id: " + socket.id);
    socket.broadcast.emit("online", { id: socket.id });
    
    socket.on("disconnect", function () {
        console.log("offline id: " + socket.id);
        socket.broadcast.emit("offline", { id: socket.id });
    });
    
    socket.on("message", function (obj) {
        var id = socket.id;
        var message = obj.message;
        
        console.log("message id: " + id + " message: " + message);
        io.emit("message", { id: id, message: message });
    });

});

io.listen(6666);

UnityEditor上では動くのにiOS端末では動かない件

XCodeのコンソールを見たら

System.ExecutionEngineException: Attempting to JIT compile method
while running with --aot-only.

などが発生していました。 通信自体の問題ではなく、Monoのコンパイラの制限のようです。 このあたりを回避するようにコーディングしたら動きました。

【Amazon.co.jp限定】uGUIではじめるUnity UIデザインの教科書-Unity5対応 特典PDF付き

【Amazon.co.jp限定】uGUIではじめるUnity UIデザインの教科書-Unity5対応 特典PDF付き