Unity

【UnityAsset】LitJson Ruler – LitJsonを用いた通信処理をExcelで自動化

ここではLitJsonRuler(LJR)の紹介を行いたいと思います。

LJRとは

LJRは、LitJsonを用いた通信のやり取りを、Excelで全て自動化したAssetです。

LitJsonはJsonをクラス化することが可能で、データのオブジェクト化が容易なライブラリかと思います。とても便利な反面、LitJsonでパースされるクラスをUnity側で定義するのが面倒であったりします(データ構造が複雑になればなるほど)。

LJRを導入することで、通信クラスの自動作成が可能です。Excelで通信のやり取りを記述するので、それ自体がドキュメントとしても活躍します。

動作環境

Unity5.0+
iOS 6.0+
Android 2.3+

使用方法

Excelで通信インターフェイスの作成

「LJR/Editor/HttpInterface.xls」を開きます。

Settingシートの設定

SettingシートのBaseURLを自分の環境にします。BaseURLは通信の際のベースとなるURLで、このURLと後述する通信コマンドのURLを結合させたものが実際の通信URLになります。例えばBaseURLがhttp://yedo-factory.co.jp/で、通信コマンドのURLがDemo.phpだった場合、実際の通信URLはhttp://yedo-factory.co.jp/Demo.phpとなります。
また、下記のようにローカル環境へのパスを指定することも可能です。こうすることで開発中はローカル環境で確認し、サーバ側が整った段階でサーバ環境に変更することも可能です。ここではローカル環境での擬似通信の手順で解説を行います。

通信コマンドの作成

Demo1シートのように通信コマンドを作成します。ここに記述した内容がUnity側で自動的にクラス変換されます。

項目解説
黄色セルプログラム側のタグ解析に使用。このセルは絶対に削除しないで下さい。
無色セルユーザ入力を行う箇所
Title通信コマンドのタイトル名。ただしUnity側では使用しないので、管理情報として使用下さい。
URL通信URL。先述したBaseURLと結合させたものが実際の通信URLになります。
RequestClassリクエストクラス名。Unity側に出力するリクエストクラス名を記述。
ResponceClassレスポンスクラス名。Unity側に出力するレスポンスクラス名を記述。
RequestParameterリクエストパラメータ。Variableに変数名、Typeにパラメータタイプ(get:GETパラメータ、post:POSTパラメータ)、Commentにコメント(管理情報)を記述。リクエストパラメータは全て文字列として扱います。
ResponceParameterレスポンスパラメータ。Variableに変数名、Typeに型情報、Commentにコメント(管理情報)を記述。型にclass/class[]を指定した場合、右に次の階層を追加します。

通信コマンド作成時の注意点

Unity側のクラス作成時、黄色セルのタグ情報を元に解析を行っています。Excel行はある程度追加/変更可能です。ただExcel列はタグ解析の際にセル数を指定して処理を行っているので、変更するとプログラムが動作しなくなる恐れがあります。基本的にデモ通信コマンドシートのフォーマットに則って、記述することをお勧めします。

ResponceParameterにclass/class[]を指定した場合、Unity側ではクラスが定義されます。このクラス名はVariableに記述した名前の先頭を大文字に変換したものを使用します。例えば、画像の game_data というクラスは Game_data というクラス名として定義されます。

Unity側のクラスはSettingシートを除いたシートを左から順に作成していきます。その際、すでに定義済みのクラスがあった場合は自動的に除外するようになっています。例えばDemo1シートの game_data というクラスは Demo2シートでも使用されています。この時、Demo2シートのクラス作成時に game_data のクラスは作成されません。こうすることで、Unity側の無駄なクラス作成と、Excel側の定義情報をスッキリされることができます。

RequestParameter、ResponceParameterは空を指定することも可能です。空の場合は下記のように指定下さい。

Unity上で通信クラスを作成

Menuから「Tools/LJR/Create」を選択。通信クラスが自動生成されます。

通信実行

作成された通信クラスで通信実行。
※擬似通信のため、ローカルのJsonファイルにアクセスしています。Jsonファイルが存在する同階層に同名のPHPファイルもありますので、サーバ環境で試したい場合はそちらを使用下さい。

{
    "user_id": 9999,
    "user_name": "yedo",
    "power_ratio": 0.7,
    "game_data": { "game_version": 1, "paratemer": [ 128 ] }
}

UnityEditor上での通信

UnityEditor上で通信テストを行うことが可能です。この機能を使用すれば、通信実行をノーコーディングで行うことが出来ます(サーバ側のプログラム除く)。
「LJR/Scripts/Http/RequestDemo1」のMonoBehaviourをHierarchyに設置。Inspector上に通信データのパラメータが表示されます。
Testボタンをクリック。通信が実行され、結果が通信クラスに反映されます。結果データはInspector上から確認可能です。

項目解説
Test通信テストボタン。クリックでUnityEditor上での通信を実行します。
Status通信ステータス。None:なし、OK:成功、Error:エラー
Message通信メッセージ。現状、エラーメッセージしか入りません。
Responceレスポンスデータ
Idリクエストパラメータ。この値が通信時のリクエストパラメータとして使用されます。

実環境での通信

実環境では以下のように行って下さい。

using UnityEngine;
using LJR;

public class SceneDemo : MonoBehaviour
{
    public RequestDemo1 RequestDemo1;

    public void Send()
    {
        string id = "1";
        RequestDemo1.Send(id, (req, res) =>
        {
            switch (req.Status)
            {
                case RequestStatus.OK:
                    Debug.Log("user_id=" + res.user_id);
                    Debug.Log("user_name=" + res.user_name);
                    Debug.Log("power_ratio=" + res.power_ratio);
                    Debug.Log("game_data.game_version=" + res.game_data.game_version);
                    Debug.Log("game_data.parameter=" + res.game_data.parameter[0]);
                    break;
                case RequestStatus.Error:
                    Debug.LogException(req.Exception);
                    break;
            }
        });
    }
}

LJRの歴史

LJRの原型は、3年前の自分の初めてのUnityアプリ開発時に生まれました。その時はただ単にExcelからレスポンスのクラスを自動作成するものでした。

その後、次のUnityアプリでリクエストもレスポンスも自動で作成され、重複クラスは除外するようにした新しいLJRを作成しました。ただ、途中からサーバ処理を担当する人間が変わったため、結局、このLJRは使用されずにお蔵入りとなりました。

今、長い年月を経て、今までのノウハウを集約した新LJRが誕生しました!

そして、これからもLJRは進化していくことでしょう。

最後に

「Excelで通信のドキュメントを作成したい」「手軽にすぐ通信処理を実装したい」「LitJsonのクラス作成の手間を省きたい」等、お考えの人は、LJRをお試し下さい。

LJRを宜しくお願いします。

【エビでもわかる】オセロプログラミング
〜オセロを作りながらゲームのプログラムを学ぼう〜
「Unityで初めてゲームを作ってみたい!」

そんな人のためにこの本を作りました。
オセロを一から作りながら実践形式でプログラムを学べる本です。
すでに完成したプロジェクトを説明するのではなく、実際に作りながら説明していきます。
一緒に手を動かしながら、プログラムを覚えていきましょう🌟