この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:4
ページ更新者:T
更新日時:2026-06-11 07:10:02

タイトル: データベースを活用する方法
SEOタイトル: Unreal Engine 5 でデータベースを活用する方法(SQLite / MySQL / Firebase / DataTable との使い分け / C++ / Blueprint)

この記事の要点
  • UE5 でデータを永続化する方法は DataTableSaveGameSQLiteHTTP API + DB(オンライン)などがある
  • SQLite はファイル 1 つで完結する軽量 DBMS。プラグイン導入でローカルランキングや大量データに最適
  • MySQL / PostgreSQL / Firebase はオンライン共有が必要なゲームに。HTTP API 経由で連携するのが定番
  • 小規模かつマスタデータなら DataTable、進行データなら SaveGame、検索/集計が要るなら SQLite 以上と使い分ける
  • C++ では sqlite3.h インクルードして直接、Blueprint ではプラグイン提供の Execute Query / Commit Transaction ノードで操作

UE5 でデータベースを使う動機

Unreal Engine 5 でゲーム開発する際、データを永続化(セーブ)したり、大量のデータを高速に検索したい場面は多くあります。スコアランキング、プレイヤープロフィール、インベントリ、アイテム図鑑、進行履歴 — これらを単一の SaveGame ファイルで持つと肥大化し、扱いも複雑になります。データベースを使うことで、SQL による検索・集計・更新が簡単になり、規模拡大にも耐えやすくなります。

UE5 のデータ永続化手段の比較

手段用途規模共有
DataTableマスタデータ(敵パラメータ等、ゲームと一緒に配布)小〜中×
SaveGameプレイヤー進行データ(バイナリ)小〜中×
SQLiteローカル DB。大量データ・検索/集計中〜大×
MySQL / PostgreSQLオンライン共有 DB(サーバ管理)
FirebaseBaaS。リアルタイム同期・認証込み中〜大
クラウドセーブ(Steam Cloud 等)SaveGame をクラウド同期小〜中

1. DataTable(マスタデータ向き)

CSV / Excel からインポートしてゲーム内で読み取り専用として使う仕組みです。書き込みはできませんが、エディタで編集できるため、敵やアイテムなど静的データに最適。

2. SaveGame(進行データ向き)

// USaveGame を継承したクラスを作成
UCLASS()
class MYGAME_API UMySaveGame : public USaveGame
{
    GENERATED_BODY()
public:
    UPROPERTY(BlueprintReadWrite) FString PlayerName;
    UPROPERTY(BlueprintReadWrite) int32   Score;
    UPROPERTY(BlueprintReadWrite) FDateTime SavedAt;
};

// 保存
UMySaveGame* Save = Cast<UMySaveGame>(
    UGameplayStatics::CreateSaveGameObject(UMySaveGame::StaticClass()));
Save->PlayerName = "Alice";
Save->Score = 1000;
UGameplayStatics::SaveGameToSlot(Save, "Slot1", 0);

// 読込
UMySaveGame* Load = Cast<UMySaveGame>(
    UGameplayStatics::LoadGameFromSlot("Slot1", 0));

3. SQLite(ローカル DB 向き)

SQLiteファイル 1 つで完結する軽量 DBMS。サーバ不要で、UE5 でローカルにスコア、ステージ進行、インベントリなどを保存するのに非常に向いています。

3-1. プラグイン導入

  1. SQLite Core(エンジン同梱)またはMarketplace の SQLite プラグインを有効化
  2. Edit → Plugins から SQLite 系プラグインを有効化 → エンジン再起動
  3. Build.cs で依存追加(C++ から使う場合)
// MyGame.Build.cs
PublicDependencyModuleNames.AddRange(new string[] {
    "Core", "CoreUObject", "Engine", "InputCore",
    "SQLiteCore", "SQLiteSupport"
});

3-2. テーブル定義例

CREATE TABLE IF NOT EXISTS Scores (
    ID         INTEGER PRIMARY KEY AUTOINCREMENT,
    PlayerName TEXT    NOT NULL,
    Score      INTEGER NOT NULL,
    SavedAt    TEXT    NOT NULL DEFAULT CURRENT_TIMESTAMP
);

CREATE INDEX IF NOT EXISTS idx_scores_score ON Scores(Score DESC);

3-3. C++ からの操作

#include "sqlite3.h"

void SaveScore(const FString& Name, int32 Score)
{
    const FString DBPath = FPaths::ProjectSavedDir() / TEXT("GameDatabase.db");
    sqlite3* DB = nullptr;

    if (sqlite3_open(TCHAR_TO_UTF8(*DBPath), &DB) != SQLITE_OK)
    {
        UE_LOG(LogTemp, Error, TEXT("DB open failed: %s"),
               UTF8_TO_TCHAR(sqlite3_errmsg(DB)));
        return;
    }

    const FString SQL = TEXT(
        "INSERT INTO Scores (PlayerName, Score) VALUES (?, ?);");
    sqlite3_stmt* Stmt = nullptr;
    sqlite3_prepare_v2(DB, TCHAR_TO_UTF8(*SQL), -1, &Stmt, nullptr);
    sqlite3_bind_text(Stmt, 1, TCHAR_TO_UTF8(*Name), -1, SQLITE_TRANSIENT);
    sqlite3_bind_int(Stmt, 2, Score);

    if (sqlite3_step(Stmt) != SQLITE_DONE)
    {
        UE_LOG(LogTemp, Error, TEXT("Insert failed"));
    }
    sqlite3_finalize(Stmt);
    sqlite3_close(DB);
}

3-4. ランキング取得

SELECT PlayerName, Score
FROM   Scores
ORDER  BY Score DESC
LIMIT  10;

3-5. Blueprint からの操作

Marketplace の SQLite プラグインを導入すると、Blueprint で以下のようなノードが使えます:

  • Open Database / Close Database
  • Execute Query(SQL 実行)
  • Get Query Result Row
  • Begin Transaction / Commit Transaction

4. オンライン DB(MySQL / PostgreSQL / Firebase)

マルチプレイ、ランキング全国共有、クロスデバイス進行管理などにはオンライン DB が必須。UE5 から直接 DB へ接続するのは現実的ではないため、HTTP API(バックエンドサーバ)を経由します。

典型構成

[UE5 クライアント]
    │ HTTP / JSON
    ▼
[API サーバ (Node.js / Go / FastAPI)]
    │ SQL
    ▼
[MySQL / PostgreSQL / Firebase]

UE5 からの HTTP リクエスト

#include "HttpModule.h"
#include "Interfaces/IHttpResponse.h"

void PostScore(int32 Score)
{
    TSharedRef<IHttpRequest> Req = FHttpModule::Get().CreateRequest();
    Req->SetURL(TEXT("https://api.example.com/scores"));
    Req->SetVerb(TEXT("POST"));
    Req->SetHeader(TEXT("Content-Type"), TEXT("application/json"));
    Req->SetContentAsString(
        FString::Printf(TEXT("{\"name\":\"Alice\",\"score\":%d}"), Score));
    Req->OnProcessRequestComplete().BindLambda(
        [](FHttpRequestPtr, FHttpResponsePtr Res, bool Ok) {
            if (Ok) UE_LOG(LogTemp, Log, TEXT("OK: %s"), *Res->GetContentAsString());
        });
    Req->ProcessRequest();
}

5. Firebase(BaaS で楽に構築)

サービス用途
Firebase Authenticationメール/Google/Apple ログイン
Cloud FirestoreNoSQL ドキュメント DB
Realtime Databaseリアルタイム同期 DB
Cloud Functionsサーバレス関数

UE5 公式 SDK はないため、Marketplace の Firebase プラグインや HTTP API(REST)経由で連携します。

セキュリティの注意

  • クライアントから直接 SQL を投げない(チート/改ざんの温床)
  • サーバ側でバリデーション(スコア上限、不正値検出)
  • SQL インジェクション対策(プレースホルダ必須)
  • 通信は HTTPS、認証は API キー or JWT
  • ローカル DB は改ざんされる前提 — ランキング集計はサーバ側で

パフォーマンスの目安

規模推奨
〜数百件、静的DataTable
〜数千件、書き込みありSaveGame
1 万件以上、検索/集計SQLite
共有/ランキングオンライン DB + API

まとめ

  • UE5 のデータ永続化は用途に応じて DataTable / SaveGame / SQLite / オンライン DB を使い分ける
  • ローカルかつ大量データならSQLite がベスト
  • 共有/ランキングはサーバ + DB 構成、Firebase なら最短
  • チート対策のため、ランキングはサーバ側で検証する

関連

  • DataTable — マスタデータ管理
  • SaveGame — プレイヤー進行データ
  • SQLite — 軽量 DBMS
  • HTTP リクエスト — UE5 から外部 API 呼び出し
  • Firebase — BaaS