見出し画像

Unity実装05 サーバーのデータをクライアントにコピー

いつもありがとうございます。

スキマ時間開発のお時間です。よろしくお願いします。


前回までのあらすじ

 クライアント側:レスポンス処理のエラーケースをある程度実装したよ!


そろそろゲーム、ゲームっぽい部分に進みたいですが、もう少し基礎を構築していきます。

レスポンス処理の正常系、データの受け渡しです。

以前作成したときは、真面目にテーブルのクラス作って、Unity様標準のJSONライブラリを利用していました。

サーバー側もララベルにテーブル定義していたからまさかの三重管理!(これって一般的なの???)

三重管理なんて根源的恐怖に曝されていたらSAN値直葬なので、DBを正にドライブするよ。


サーバー側。

 // バージョンチェック ※全更新のため、バージョンチェックは不要!
// require_once 'chkver.php'; 

// 取得条件
$FROM = '';
$WHERE = '';

// JSONヘッダ処理
echo '{';

// 種族マスタ
$FROM = 'XXXXXXXXXX';
$WHERE = '0 = 0';
require 'getTable.php';
echo ',';

// 明細マスタ
$FROM = 'XXXXXXXXXX';
$WHERE = '0 = 0';
require 'getTable.php';


// JSONフッタ処理
echo '}';
getTable.php 一部抜粋

 // SQLステートメントを実行し、結果を変数に格納
$sql = "SELECT * FROM ".$FROM." WHERE ".$WHERE;
$stmt = $dbh->query($sql);

// 連想配列のみ出力するモード(数値は不要)
$stmt->setFetchMode(PDO::FETCH_ASSOC);

// データセットを出力
echo '"'.$FROM.'":{';

$no = 0;
foreach ($stmt as $row) {

 // 最初のみ、区切り文字不要
 if ($no !== 0){
  echo ',';
 }
 
 // JSONにして出力
 echo '"'.$no.'":';
 echo json_encode($row,JSON_UNESCAPED_UNICODE);
 
 $no++;
}

echo '}';

ポイントは「連想配列のみ出力するモード」。(あとは素直なもの)


受け側はこんな感じ。

			// SQLite
			SqliteDatabase sqlDB = new SqliteDatabase("Service.db");

			// レスポンスがデータのJSONだった場合
			LitJson.JsonData p_JsonData = LitJson.JsonMapper.ToObject(txt_response);
			foreach(String p_tablenm in p_JsonData.Keys)
           {
				foreach (String p_rowno in p_JsonData[p_tablenm].Keys)
               {
					List<string> p_col_list = new List<string>();
					List<string> p_val_list = new List<string>();

					foreach (String p_colnm in p_JsonData[p_tablenm][p_rowno].Keys)
                   {
						if (p_JsonData[p_tablenm][p_rowno][p_colnm] != null) {
							p_col_list.Add(p_colnm);
							p_val_list.Add((string)p_JsonData[p_tablenm][p_rowno][p_colnm]);
						}
					}

					// 1レコードずつUPSERT
					String p_sql = "REPLACE INTO " + p_tablenm + " ("+ String.Join(",", p_col_list) + ") VALUES (\"" + String.Join("\",\"", p_val_list) + "\");";
					sqlDB.ExecuteQuery(p_sql);
				}
			}

ポイントは、テーブル名、行番号、項目名を決め打ちで取得するところ。

他のツリー構造のJSONが来たらアウト。

それでも、C#にもphpにもテーブル構造持つよりはよっぽどセーフティーだと思うだけど。


上記みたいなサンプルコードはwebで見つけられませんでした。(そんな変な方針何だろうか。。。超不安。)


クライアント側のマスタでもデータが入るようになりました。

画像1


そろそろユーザ登録したい。。。


最後まで読んでいただきありがとうございました。

この記事が気に入ったらサポートをしてみませんか?