Unity で MessagePack を利用する

シェアする

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

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

Sponsored Links

サーバに 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 を利用するのが良さそうだ。単にぐぐってすぐ出てきたという理由だがこれを利用してみる。

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

シェアする

フォローする