Lightning Blog
Unity記事イメージ画像

【Unity】 SQLiteのEntityFrameworkを利用する

更新日:2024/03/18
この記事では、UnityでSQLiteのEntityFrameworkを利用する方法について解説していきます。

    目次

  • SQLiteとは?
  • Entity Frameworkとは?
  • 導入前の準備
  • 必要なライブラリのインストール
  • DBファイル作成
  • テーブル作成
  • エンティティとDBコンテキスト
  • まとめ

SQLiteとは?

セクション画像

アプリケーションに組み込むことで利用できる、オープンソースの軽量のRDBMS(データベース管理システム)です。 これを利用することで、ゲームの設定値やアイテムリストをDBで管理できるのでとても便利です。

SQLite

Entity Frameworkとは?

セクション画像

Entity Frameworkを使うと、データベースのテーブルをクラスとしてプログラム内に表現することができます。 そして、これらのクラスのインスタンスを通じて、データベースの読み書きができるようになります。

LINQの書き方を知っていれば、簡単にデータベース操作を行うことができます。

EntityFrameworkLogo

導入前の準備

セクション画像

本記事では、ライブラリのインストールする際に、[NuGetForUnity]というツールを使用していきます。 使用方法については、以下リンクのGitHubの[README]に記載されていますので、そちらを参照してください。

NuGetForUnityはこちらから

必要なライブラリのインストール

セクション画像

以下の2つのライブラリを[NuGetForUnity]を使って、インストールしていきます。

  • Microsoft.EntityFrameworkCore.Sqlite.Core - Version 5.0.17
  • SQLitePCLRaw.bundle_e_sqlite3 - Version 2.1.8

インストール例を見ていきます。 まずインストールするには、まず[NuGet]→[Manage NuGet Packages]を開きます。

Manage NuGet Packages

検索欄にインストールしたいライブラリ名を入力して、[Search]をクリックします。 例として、[Microsoft.EntityFrameworkCore.Sqlite.Core]を検索しています。

Search

インストールしたいライブラリが表示されたら、適切なバージョンを選択して、[Install]をクリックします。 バージョンは[5.0.17]を選択しています。これでインストール完了です。

同じ手順で[SQLitePCLRaw.bundle_e_sqlite3]もインストールしてください。

Install

Nugetでライブラリをインストール後にたくさんのエラーが出ることがあります。 その場合は、一度Unityエディタを終了して、再度立ち上げてみてください。

Error

最後に[e_sqlite3.dll]というライブラリを手動取得します。 取得方法は様々ですが、今回はサイトからダウンロードします。

以下リンクから該当のものをダウンロードしてください。

e_sqlite3.dll はこちらから
e_sqlite3.dllダウンロード

DBファイル作成

セクション画像

まず、Unity内にDBを格納するフォルダを作成していきます。 [Assets]フォルダの直下に[StreamingAssets]という名前でフォルダを作成します。 このフォルダにデータを格納するためのDBファイルを作成していきます。

StreamingAssets

このフォルダではゲーム内で直接読み込むことができるアセットを格納することができます。 このフォルダ内に置かれたファイルは、ビルド時にそのままの形でゲームに組み込まれ、 ファイルのパスを指定することで、実行時にアクセスして読み込むことが可能です。

次にDBファイルを作成していきます。 色々方法はありますが、今回はGUIで作成できる[DB Browser for SQLite]を使用します。 以下のリンクから、インストーラをダウンロードしてインストールしてください。

DB Browser for SQLite はこちらから
DB Browser for SQLite

インストールが終わったら、アプリを開いて、[New Database]をクリックします。

New Database

保存先を[StreamingAssets]にして、今回は[test]という名前のDBを作成します。

New Database Save

テーブル作成

セクション画像

データを格納するテーブルを作成していきます。 例として、武器情報を想定して[Weapons]テーブルを作成してみます。 まず[Open Database]をクリックして、先ほど作成したDBと接続します。

Open Database

接続したら、[Execute SQL]を選択して、以下のSQL文を実行してください。 そうすることでテーブルが作成されます。


CREATE TABLE Weapons (
    Id INTEGER PRIMARY KEY,
    Name TEXT NOT NULL,
    Description TEXT NOT NULL,
    AttackPower INTEGER NOT NULL
);
Execute SQL

エンティティとDBコンテキスト

セクション画像

Unity側でDBに接続するための処理を作成していきます。 はじめに、作成したテーブルに対応したエンティティクラスを作成します。


using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

/// <summary>
/// 武器テーブルのエンティティクラス
/// </summary>
[Table("Weapons")]
public class Weapon
{
    /// <summary>
    /// 識別子
    /// </summary>
    [Key]
    public int Id { get; set; }

    /// <summary>
    /// 名前
    /// </summary>
    [Required]
    public string Name { get; set; }

    /// <summary>
    /// 武器説明
    /// </summary>
    [Required]
    public string Description { get; set; }

    /// <summary>
    /// 攻撃力
    /// </summary>
    [Required]
    public int AttackPower { get; set; }
}

次にDBに接続するためのDBコンテキストクラスを作成していきます。 このクラスがDBとの接続を担うクラスになります。


using Microsoft.Data.Sqlite;
using Microsoft.EntityFrameworkCore;

/// <summary>
/// DB接続クラス
/// </summary>
public class TestDbContext : DbContext
{
    /// <summary>
    /// 武器テーブルのデータが格納される
    /// </summary>
    public DbSet<Weapon> Weapons { get; set; }

    /// <summary>
    /// 接続文字列
    /// </summary>
    private readonly string _connectString;

    /// <summary>
    /// コンストラクタ
    /// </summary>
    /// <param name="connectString">接続文字列</param>
    public TestDbContext(string connectString)
    {
        _connectString = connectString;
    }

    /// <summary>
    /// オプション構成
    /// </summary>
    /// <param name="optionsBuilder">オプションビルダー</param>
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        var connectionString = new SqliteConnectionStringBuilder { DataSource = _connectString }.ToString();
        optionsBuilder.UseSqlite(new SqliteConnection(connectionString));
    }
}

作成したDBコンテキストクラスを使って、DBに接続して処理を行います。 以下のような使用感で使うことができます。


using System;
using System.IO;
using System.Linq;
using TMPro;
using UnityEngine;

public class DbContextSample : MonoBehaviour
{
    /// <summary>
    /// AddDataのメッセージを表示するテキスト
    /// </summary>
    [SerializeField]
    private TextMeshProUGUI _textAddData;

    /// <summary>
    /// ReadDataのメッセージを表示するテキスト
    /// </summary>
    [SerializeField]
    private TextMeshProUGUI _textReadData;

    /// <summary>
    /// DBにデータ追加するサンプル
    /// </summary>
    public void AddData()
    {
        try
        {
            // 接続先パス
            var connectString = Path.Combine(Application.streamingAssetsPath, "test.db");
            using (TestDbContext testDbContext = new TestDbContext(connectString))
            {
                Weapon weapon = new Weapon()
                {
                    Name = "ラグナロク",
                    Description = "伝説の武器です。勇者しか扱えない。",
                    AttackPower = 500
                };

                // 武器をデータベースに追加
                testDbContext.Weapons.Add(weapon);

                // 変更を保存
                testDbContext.SaveChanges();

                _textAddData.text = "AddData Success";
            }
        }
        catch(Exception e)
        {
            Debug.Log(e);
            _textAddData.text = "AddData Failure";
        }
    }

    /// <summary>
    /// DBからデータ読み込むサンプル
    /// </summary>
    public void ReadData()
    {
        try
        {
            // 接続先パス
            var connectString = Path.Combine(Application.streamingAssetsPath, "test.db");
            using (TestDbContext testDbContext = new TestDbContext(connectString))
            {
                // 武器をデータベースに追加
                var weapon = testDbContext.Weapons.Where(weapon => weapon.Id == 1).SingleOrDefault();

                if(weapon != default)
                {
                    Debug.Log(weapon.Name);
                    Debug.Log(weapon.Description);
                    Debug.Log(weapon.AttackPower);
                }

                _textReadData.text = "ReadData Success";
            }
        }
        catch (Exception e)
        {
            Debug.Log(e);
            _textReadData.text = "ReadData Failure";
        }
    }
}

Application.streamingAssetsPathで[StreamingAssets]フォルダまでのパスを取得できます。 そのパスを引数にしてTestDbContextを作成して、データベースの操作を行っています。 AddDataメソッドには、DBに武器データを追加処理、ReadDataには、DBから武器データを読み込む処理が書かれています。

実際にこのクラスを使用しているサンプルシーン(SqliteEfScene)をGitHubに用意してありますので、よかったら動かしてみてください。

SqliteEfScene

まとめ

セクション画像

今回はSQLiteのEntityFrameworkの導入方法について解説しました。 EntityFrameworkを使うと開発が捗りますので、是非利用してみてください。


ブログ内の記事で書かれているサンプルコードは、GitHubから確認する事ができます。 是非参考にしてみてください。

この本では、Unityの基本から高度なテクニックまで、実際のプロジェクトに役立つ知識を網羅しています。 初心者から経験者まで、Unityを扱うすべての開発者にとっての必読書です。

この本を読んで、あなたのUnityスキルを飛躍的に向上させませんか?

合わせて読みたい

カード画像
衝突判定について

Unityでの衝突判定の基本を解説。初めに、Cubeオブジェクトを[Hierarchy]から作成。衝突判定は[Collider]コンポーネントを利用し、今回は[BoxCollider]を使用。自作オブジェクトに衝突判定を付与する際は、[Add Component]から選択。オブジェクトを動かすため[RigidBody]コンポーネントを追加し、落下させて衝突を確認。衝突後はコンソールに[衝突した!!]と表示するプログラムを実装。これを応用でゲームを楽しむことができる。

更新日:2023/07/20

An error has occurred. This application may no longer respond until reloaded. Reload 🗙