KirisimaCreate備忘録

アプリ制作の備忘録とか思うことをつらつら...

UnityでSQLiteを使ってガチャガチャを作ってみる

クリッカーゲームを作りたくてアイディア練ったいたときに
ガチャガチャみたいなシステムを入れてみたくなった

自分用に備忘録として残しておく

ガチャガチャを作りたい

どうやったら実現できるのか考えてみる

  • ガチャから出てくるもの(ここでは武器)のデータを作る
  • ゲーム内で武器データをランダムで一つだけ取得する
  • 取得したデータを保存する

こんな感じでいけるのでは?ととりあえず深く考えずに作ってみることにした

取得する元のデータを作る

こういうデータのことをマスターデータと言うらしい(ド素人)
調べてみるとCSVExcelで作ったデータをSQLiteなどで管理している人が多そうだった

情報量も多そうだしSQLiteを使ってみる
GoogleSpreadSheetのアドオンにシート丸ごとSQLiteに変換してくれるものがあったのでこれを使う

データの中身

weapons ガチャガチャの中身

id weapon_category name detail damage
0 Assault M4A1 かっちょいいアサルトライフル 20
1 Assault AK47 ちょーつよいアサルトライフル 36
2 Sniper L96 かっちょいいスナイパー 100


get_weapons ガチャから出てきた武器データを保存するのに使う

id weapon_category name detail damage

シート名がSQLiteのテーブル名になるので適当に付けておく

こんな感じで中身のあるシートと空のシートを作る

SQLiteに変換する

chrome.google.com
こちらをインストールしたらシートに戻って アドオン -> SheetToSQLite -> Convert All Sheetsを選択
暫くするとダウンロードリンクが表示されるので適当な名前を付けて保存する
(ここではWeaponMasterData.sqlite)

データ型がすべてTEXTになる
INTEGERなどに変えたい場合はGUIクライアントかなんかを使って編集をする
むしろGoogleSpreadSheetなんか使わずに最初からSQLite用のGUIクライアントで作ればいい

SQLiteをUnityで使えるようにする

有料のアセットなどもある
今回はSQLiteUnityKitを使う

blog.livedoor.jp
上記のサイトを参考に導入した
sqlite3.dll関連を配置という項目で

64bit版をみつけるのに苦労しました…

http://blog.livedoor.jp/nyangostar/archives/24903485.html

とありますが現在はSQLite公式に64bit版も一緒に置いてある
解凍すると32bit版、64bit版もファイル名が一緒なのでUnityのフォルダに入れるとき注意する

ガチャガチャのようなものを実装してみる

データを取得して作っておいた空のテーブルに追加する
SqliteDataBase weaponDB = new SqliteDataBase("WeaponMasterData.sqlite");
//weaponsテーブルからランダムで一件取得してget_weaponsテーブルに追加
string query = "INSERT INTO get_weapons SELECT * FROM weapons ORDER BY RANDOM() LIMIT 1";
weaponDB.ExecuteQuery(query);

追加できた

string query= "INSERT INTO get_weapons SELECT * FROM weapons WHERE weapon_category='Assault' ORDER BY RANDOM() LIMIT 1";

とすることでweapon_categoryがAssaultの中から一件取得してくれる
シングルクォーテーションを忘れると怒られる
※TEXTの場合だけだと思われ。INTEGERとかだったらいらない(?)

こいつハゲればいいのに

データを使う

ガチャガチャから出てきたデータを使う

string query = "SELECT * FROM get_weapons"
DataTable getWeaponData = weaponDB.ExecuteQuery(query);
string weaponCategory = "", name = "", detail = "";
int id = 0, damage = 0;
foreach(DataRow dr in getWeaponData.Rows)
{
    id = (int)dr["id"];
    weaponCategory = (string)dr["WeaponCategory"];
    name = (string)dr["name"];
    detail = (string)dr["detail"];
    damage = (int)dr["damage"];
    Debug.Log("ID:" + id + " WeaponCategory:" + weaponCategory + " Name:" + name + " Detail:" + detail + " Damage:" + damage);
}

とりあえず完成

あとは焼くなり煮るなり好きにする
この方法が正解なのかわからない

終わり