開発したアプリなど一覧

Unity で MessagePack を利用する

記事内にアフィリエイトリンクを含む場合があります

MessagePack というデータ形式がある。データをバイナリにシリアライズ/デシリアイズするものだが、Json などの形式よりデータのサイズが少なく且つ高速であるという利点がある。

MessagePack: It's like JSON. but fast and small.

自分も名前だけは聞いていたがちょっと見た感じ Json より良さそうと感じたのでさっそく Unity で利用してみる。

サーバに MessagePack を出力するスクリプトを設置

今まで Json で取得していたデータを MessagePack に置き換える事を目的としているので、Unity のスクリプトを書く前にサーバ側に MessagePack を出力するスクリプトを置いておく。

以下のような ruby スクリプトを cgi が実行できる箇所に配置した。gem install msgpack しておく必要がある。

#!/usr/bin/env ruby

require 'cgi' require 'msgpack'

msg = ['金剛', '比叡', '榛名', '霧島'].to_msgpack #msg = [1024,2048,4096,8192].to_msgpack

cgi = CGI.new() headers = {'type' => 'application/x-msgpack', 'charset' => 'x-user-defined'} cgi.out(headers){msg}

ブラウザでアクセスすると保存するか?と聞かれるが無視してインスペクタで Response を開くと・・・

msgpack-ruby

読めるわけなかった。

msgpack-unity

Unity で MessagePack を利用するには msgpack-unity を利用するのが良さそうだ。単にぐぐってすぐ出てきたという理由だがこれを利用してみる。

southwudang/msgpack-unity

src 以下を全部 Unity 上に取り込めば使えるようになる。

取り込んだらスクリプトを書く。C# を使ってます。

using UnityEngine; using System.Collections; using System.Collections.Generic; using System.Text;

public class MsgpackTest : MonoBehaviour {

IEnumerator Start () { WWW www = new WWW("http://example.com/msgpack.cgi"); yield return www; MsgPack.BoxingPacker packer = new MsgPack.BoxingPacker(); IList msg = (IList)packer.Unpack(www.bytes); for (int i=0; i<msg.Count; i++) { Debug.Log(Encoding.UTF8.GetString((byte[])msg[i])); } } }

以下のように Console で確認できる。

msgpack-unity

数値であれば msg[i] をそのまま出力できるのだが日本語は byte[] のままだったので Encoding.UTF8.GetString を使用して byte[] から string へ変換している。面倒くさいんだけどどうにかならないんだろうか。

Sponsored Link

コメント

タイトルとURLをコピーしました