見出し画像

UnityでsqLiteが使いたいだけなのに

Unityでデータベースを使いたいよChatGPT~!


と、相談すると、選択肢が以下のように出ました


Unityにおいて個人開発で使用できるデータベースはいくつか選択肢があります。以下はそのいくつかです:

  1. SQLite:

    • 軽量で埋め込み型のデータベースエンジンで、Unityでも利用できます。

    • ファイルベースのデータベースで、クロスプラットフォーム対応です。

  2. Firebase:

    • Googleが提供するモバイルおよびウェブアプリケーション向けのプラットフォームで、リアルタイムデータベースや認証機能が含まれています。

    • UnityでFirebase SDKを使用することで、データの読み書きや認証などが容易になります。

  3. Realm:

    • モバイルアプリケーション向けに特に設計されたデータベースで、Unityでも使用できます。

    • Realmはオブジェクト指向データベースであり、シームレスなオブジェクトの永続性を提供します。

  4. PlayFab:

    • ゲーム開発者向けのクラウドベースのサービスで、Unityとの統合が容易です。

    • ユーザーデータ、プレーヤーアカウント、リーダーボード、アナリティクスなどを管理するために使用できます。

  5. RESTful APIを利用する:

    • 独自のバックエンドサーバーを構築し、UnityからRESTful APIを介してデータを取得・送信する方法もあります。

    • この場合、データベースとしてはMySQLやMongoDBなどを利用することが一般的です。

  6. Object-oriented databases:

    • オブジェクト指向のデータベースは、Unityのオブジェクトとシームレスに統合できる場合があります。例えば、ObjectDBなどがあります。

データベースの選択はプロジェクトの要件によります。軽量さ、クロスプラットフォーム対応、リアルタイム性など、プロジェクトのニーズに最適なものを選択することが重要です。

なるほどありがとう。ほかのものもいつか使用することが必要だろうが、

今回はSQLiteにするよ!


以下はUnity Asset Storeなどで人気のあるSQLiteプラグインの例です:

これらのプラグインはSQLiteデータベースとのやり取りを容易にするためのクラスやメソッドを提供しています。使用するプラグインに関連するドキュメントやサンプルコードがあるか確認し、適切に統合してください。

ありがとう、SQLiteUnityKitはアセットストアに存在しないので、GitからダウンロードできるSQLite4Unity3dにしようと思う。

Gitからダウンロード

緑色のcodeボタンからzipをダウンロード

どうやら、ios,android,windowsで使用できるらしい。日本語でのクエリもできるという。さっそくダウンロードして解凍、readmeを読もう

5つのファイルがありますね

README.mdによると

Unity3d 開発を始めたとき、プロジェクトで SQLite を使用する必要がありましたが、それを機能させるための簡単な手順が記載されている場所を見つけるのは非常に困難でした。私が入手したのは、Unity3d のアセット ストアの有料ソリューションへのリンクと、さまざまで複雑なチュートリアルだけでした。

# What's this?

わかる

最終的に、もっと簡単な方法があるはずだと判断し、**SQLite4Unity3d** を作成しました。これは、Unity3d プロジェクトで SQLite を明確かつ簡単な方法で使用するのに役立ち、iOS、Mac、Androidおよび Windows
プロジェクトで動作するプラグインです。さらに詳しく知りたい場合は、github リポジトリ にアクセスすることをお勧めします。

# What's this?

ふむふむでは使い方は?

プロジェクトで使用を開始するために必要なことは次のとおりです。 1. [この zip をダウンロード](https://github.com/codecoding/SQLite4Unity3d/raw/master/SQLite4Unity3d.zip) して、そのコンテンツを抽出し、**結果のフォルダーを Assets/Plugins フォルダーにコピーします**。これには、Unity3d が sqlite にアクセスするために必要な DLL が含まれています。 2. **SQLite.cs** ファイルをスクリプト フォルダーにコピーします。 3. **SQLite データベース ファイルを出荷する場合は、**SQLite データベース ファイルを Assets/StreamingAssets フォルダーにコピーすることを忘れないでください。 4. **これで完了です。** これで、sqlite-net を使用してデータベースにアクセスできるようになりました。

# The fast track

なるほど最初に解凍したものの中にあったSQLite4Unity3d.zipをさらに解凍するのですね

解凍すると、ファイルがふたつ。mac用とwindows用ということだろうか…そんなのいるかな?

しかし、言う通りにするべきだろう。

AssetsフォルダにPluginsフォルダを作って、解凍したものを入れる。
続いて
SQLite.csファイルを、Scriptsフォルダにコピーします

SQLite4Unity3dフォルダ内に存在した

コピーすると、SQLite.csが世界に二つあることになってしまうので、Scriptsの方を残して、SQLite4Unity3dの方は削除しましょう。

次にデータベースファイルがあるならばStreamingAssetsフォルダに入れる。

これで完了です。本当だろうか。StreamingAssetsフォルダを作ってないので、新規作成した。これで使えるようになる。が、どう使うかわからないので、

サンプルをいじりましょう。


サンプルをどう扱うのだろう。Exampleの中はこう

.metaってなんだ?いっぱいあるが…しかしまあ、なんというか、こいつがAssetの直下にあったらいいような雰囲気ですね。テスト用2Dプロジェクトを適当に作って、インポートしてみましょう


Plugin1などのファイルが出た理由は不明

参考の動画にあわせていきたいが、動画のように開けなかったので手動で展開した。[CreateDBFromScript]のシーンを開く。

さっそく実行したらゲームビューに上記が…

コンソールにも以下が

うん?SQLiteが動いていそうだなあ。
StreamingAssetsフォルダに以下が生成された!

tempDatabaseが作られた。

DB Browser for SQLで中を確認してみると

DBが作られているようだ

サンプルでは、起動時にCreateDBScript.csを呼び出して、DataService.csのCreateDBを実行している。
このCreateDBのスクリプト内に、DropTable、CreateTable、InsertAll…と処理されているので、例えばボタン押下でそれが動けばいいやと思う。

ボタンを追加してみた

この中でDB作成を書いてみよう
(ChatGPTに作ってもらいました)

using UnityEngine;
using UnityEngine.UI;
using SQLite4Unity3d;

public class DatabaseManager : MonoBehaviour
{
    private SQLiteConnection _connection;

    public Button yourButton;

    private void Start()
    {
        // データベースファイルのパスを指定して接続
        string databasePath = "Assets/StreamingAssets/data.db"; // StreamingAssets フォルダにデータベースがあると仮定
        _connection = new SQLiteConnection(databasePath);

        // テーブルが存在しない場合は作成
        _connection.CreateTable<Person>();

        // ボタンにクリックイベントを追加
        yourButton.onClick.AddListener(OnButtonClick);
    }

    private void OnDestroy()
    {
        // アプリケーション終了時に接続を閉じる
        if (_connection != null)
        {
            _connection.Close();
        }
    }

    private void OnButtonClick()
    {
        // データの挿入例
        InsertPerson(new Person { Name = "ButtonClicked", Age = 30 });

        // データの取得例
        var people = _connection.Table<Person>().ToList();
        foreach (var person in people)
        {
            Debug.Log($"ID: {person.Id}, Name: {person.Name}, Age: {person.Age}");
        }
    }

    private void InsertPerson(Person person)
    {
        _connection.Insert(person);
    }
}

ボタンをアセットして、実行すると…


起動の時点でDBファイルが作られる


ボタン押下でデータが作成される

つらい戦いだったが、この調子でSELECT、UPDATE、DELETE、INSERTができそうな気がします。ヒイヒイ((´д`))

つまりどうすればいいか

SQLiteを使用したいプロジェクトを開いてPluginsフォルダに以下を保存

そのうち、

SQLite.csのファイルをScriptsのフォルダに移動してあげる。


データベースの場所として

StreamingAssetsフォルダを作成しておく。


これで、さきほどのスクリプトは動作します!


つらい戦いでした。

あの、もしかして上記スクリプトで実行したい場合は、別途モデルクラスを作っていないとエラーになりますので、以下を使用してください。

public class Person
{

    [PrimaryKey, AutoIncrement]
    public int Id { get; set; }
    public string Name { get; set; }
    public string Surname { get; set; }
    public int Age { get; set; }

    public override string ToString()
    {
        return string.Format("[Person: Id={0}, Name={1},  Surname={2}, Age={3}]", Id, Name, Surname, Age);
    }
}


そして、このスクリプトでは、アプリケーションが閉じられるまで接続が維持されるので、データベース接続のプールか、シングルトンパターンを使用して、データベース接続を再利用可能な状態にすることが良いでしょう。


誰かのお役に立ったら幸いです


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