anz blog

UnityでLiteDBをつかってみるぞ!

2018-03-30 #Unity

まーた久しぶりにちょっとUnityで遊ぼう欲が高まっているので、
最近少しずつさわっていたのですが...
さて...データどうしようかな?使ったこと無いのがいいな〜
ってことで、

LiteDBを触ってみた

です!

環境

  • Unity v2017.2

以前がっつり、ニフクラを使った時にちょっと制限が強くて心が折れたことがあって、ランキングとかでさっぱり使うならまだしも、
ゲームDBとして使うにはなーーーっていうので、他に何か。。。?

これを読んだこともあってScriptableObjectか!?とかおもったけど、マスターデータならまだしもユーザデータは無理だしな...となりーの
SQLiteとかはもう使い倒したしな〜あきたな〜感と...

そんなこんなであーだこーだしてて、発見したのがLiteDBです!(笑)

LiteDB is 何

  • NoSQL
  • SQLiteのように単一ファイルとして動作する(xxx.dbみたいなのつくる)
  • LiteDB.dllがコンパクトサイズ(300KBちょい)
  • スレッドセーフ
  • C#.Net製(Linqをガシガシつかいます)
  • 暗号化対応
  • 動作が高速
  • v4からUnityサポートしたっぽ

とかが特徴ですかね?(多分(笑)
パフォーマンスはこちら
全てにおいてSQLiteより上回っているというわけではないみたい
でも、頻繁に発生するであろうinsert/update/queryがだいぶ早いので、SQLiteよりいいかも...?

NoSQLってことでLinqつかうので、そちらに慣れているかたにとっちゃ最高なのでは?(笑)

Unityに導入するぞ!

ここからv4系の最新を落としてきて、
Unityの Assets>Plugins のなかに LiteDB.dll を配置する。 で、これが .NET 4.0 で作られているので、Unityでつかう.NETのバージョンも4.0にする必要があります...
(これがもっともネックですかね?まだstableじゃないですもんね...)

File > Build Settings > Player Settings を開いて、その中の
Other Settings > Configuration > Scripting Runtime Version というドロップダウンリストがあるので
そちらで**.NET 4.6**を選択する!(その後再起動するように言われるのでしてね!)

Configuration

それで導入は完了です〜

いざ使ってみるぞ!

なにはともあれデータモデルクラスはこんな感じで

public class Monster
{
    public int Id { get; set; }
    public string Name { get; set; }
}

つかってみる

using LiteDB;  // これわすれずに

...省略...

public void Something()
{
    var dbName = "game.db";
    var connectionString = string.Format("{0}/{1}", Application.persistentDataPath, dbName);
    using (var db = new LiteDatabase(connectionString)) {
        
        // 登録するやつ
        var monster = new Monster();
        monster.Name = "まもの";
        
        var monsters = db.GetCollection<Monster>("monsters");
        
        // 登録するぞ
        
        // インデックスを指定するならこう
        // 第二引数のboolはUnique指定
        monsters.EnsureIndex(x => x.Name, true);
        
        monsters.Insert(monster);
        
        // 更新する場合はこう
        monster.Name = "まもの2";
        monsters.Update(monster);
        
        // 検索はこう
        // 例:Nameが ま ではじまるもの
        var results = monsters.Find(x => x.Name.StartsWith("ま"));
    }
}

雑に書くとこういう感じ。

暗号化

暗号化も対応しているといったので、こちらも書いておきます
connectionString を少しいじるだけです

// 変更前
var dbName = "game.db";
var connectionString = string.Format("{0}/{1}", Application.persistentDataPath, dbName);

// 暗号化対応
var dbName = "game.db";
var encryptPassword = "あんごうかようぱすわーど";
var connectionString = string.Format("Filename={0}/{1};Password={2}", Application.persistentDataPath, dbName, encryptPassword);

これで暗号化されまっする。
というか、wikiがちゃんとあるのでそちらを見て下さい(笑)

実機でも動くかな?ときになったので、
上記な感じで登録して、すぐさま検索して名前をラベルに表示するみたいなのつくって
手元のAndroidで試した感じ問題なく表示されたので動いてました!
(僕の泥端末では!(笑))

ま、UnityAssetStoreにもアセットがあるので大丈夫っしょきっと動くでしょ!💪 LiteDB for Unity

viewerないかな?

いまんとこ.dbのなかみを見るすべがわからん...。
ターミナルとかでも全然いいんだけど...なにかないかな〜〜?
for MacOSでな!😇

参考