laravelのクエリビルダで取得したデータを圧縮してUnity側で解凍する方法
laravel(PHP)側のプログラミング
// クエリビルダを使ってDBからデータを取得する
$db_data = DB::table('simulation_data')
->select('create_at', 'data1', 'data2', 'data3', 'data4', 'data5')
->where('vibrated_at', '<=', $nowDate)
->get();
// データを圧縮する
$str_data = json_encode($db_data->toArray()); // 配列にしてJSONに変換
$gz_data = gzencode($str_data, 9); // gzip圧縮
$gz_base64 = base64_encode($gz_data); // BASE64エンコード
$simulation_data['gz_base64'] = $gz_base64;
Javascript(vue.js)側のプログラミング
:
// 通信処理
axios({
url: '/api/simulation/get_data/', // アクセスURL
method: 'POST',
params: {}
}).then(response => {
if (response.status !== OK) {
alert("通信エラー:" + response.status);
}
// UnityLoader.instantiate()で生成したUnityインスタンス
unityInstance.SendMessage(
'Canvas',
'SetSimulation', // 関数名
JSON.stringify({
"simulation_data": response.simulation_data, // そのまま渡すだけ
})
);
});
Unity WebGL(C#)側のプログラミング
using MiniJSON;
using System.IO;
using System.IO.Compression;
// データを処理する関数
public void SetSimulation(string simulation_data)
{
Dictionary <string, object> data_list = Json.Deserialize(simulation_data) as Dictionary<string, object>;
string gz_base64 = data_list["gz_base64"];
byte[] gzData = Convert.FromBase64String(gz_base64); // base64からgzipへ
string jsonData = DeComporessGZIP(gzData); // gzipからJSONへ
var unzip_data = MiniJSON.Json.Deserialize(jsonData) as IList;
foreach(Dictionary <string, object> data in unzip_data)
{
Debug.Log(data["create_at"]); // 解凍されたデータ
}
}
// gzipからJSONへ変換する関数
public static string DeComporessGZIP(byte[] _bytes)
{
using(var memoryStream = new MemoryStream(_bytes))
{
using(var deflateStream = new GZipStream(memoryStream, CompressionMode.Decompress))
{
using(var reader = new StreamReader(deflateStream))
{
return reader.ReadToEnd();
}
}
}
}
0 件のコメント:
コメントを投稿