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

タイトル: データ アセットとデータ テーブルの違い
SEOタイトル: UE5 Data Asset と Data Table の違い (使い分け / Asset Manager / CSV 連携)

この記事の要点
  • Unreal Engine 5 で外部データを保持する仕組みは大きく 2 つ: Data Asset と Data Table
  • Data Asset = UDataAsset 継承の 単一インスタンス。アイテム 1 個 / 武器 1 種類など個別管理向き
  • Data Table = USTRUCT + UDataTable による行ベース。CSV / JSON / Excel から一括インポート
  • Data Asset は型安全 / 個別差分管理 / Soft Reference 向き。Asset Manager で名前空間管理
  • Data Table は大量データの一括編集 / バランス調整向き。スプレッドシートから差替えやすい
  • 実務では併用: ID と数値は Data Table、アイコンやメッシュの参照は Data Asset (Primary Data Asset) に分ける

結論: ざっくり使い分け

用途推奨
アイテム 100 種類のステータスをまとめて編集したい★ Data Table (CSV インポート)
武器ごとに固有のメッシュ / アニメ / マテリアルを持たせる★ Data Asset (Primary Data Asset)
キャラの定数だけ Excel で管理したい★ Data Table
Asset Manager でメモリ管理したい★ Primary Data Asset
ローカライゼーション (StringTable と連携)★ Data Table
Blueprint Editor で個別にプロパティを丁寧に組みたい★ Data Asset

Data Asset とは

UDataAsset (または UPrimaryDataAsset) を継承した、シリアライズ可能な単一インスタンスのアセット。「武器A.uasset」「武器B.uasset」のように1 ファイル = 1 オブジェクトで扱います。

// WeaponDataAsset.h
#pragma once
#include "CoreMinimal.h"
#include "Engine/DataAsset.h"
#include "WeaponDataAsset.generated.h"

UCLASS(BlueprintType)
class MYGAME_API UWeaponDataAsset : public UPrimaryDataAsset
{
    GENERATED_BODY()

public:
    UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Weapon")
    FName WeaponId;

    UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Weapon")
    FText DisplayName;

    UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Weapon")
    int32 Damage = 10;

    UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Weapon")
    TSoftObjectPtr<USkeletalMesh> Mesh;

    UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Weapon")
    TSoftClassPtr<UAnimInstance> AnimClass;

    // Primary Data Asset の場合
    virtual FPrimaryAssetId GetPrimaryAssetId() const override
    {
        return FPrimaryAssetId("Weapon", WeaponId);
    }
};

エディタ上で Content Browser → 右クリック → Miscellaneous → Data Asset → UWeaponDataAsset として個別ファイルを作成します。

Data Table とは

USTRUCT で定義した行を、表 (Table) として保持するアセット。Excel / CSV から一括インポートでき、エディタ上で行 ID をキーに検索できます。

// WeaponRow.h
#pragma once
#include "CoreMinimal.h"
#include "Engine/DataTable.h"
#include "WeaponRow.generated.h"

USTRUCT(BlueprintType)
struct FWeaponRow : public FTableRowBase
{
    GENERATED_BODY()

    UPROPERTY(EditAnywhere, BlueprintReadOnly)
    FText DisplayName;

    UPROPERTY(EditAnywhere, BlueprintReadOnly)
    int32 Damage = 10;

    UPROPERTY(EditAnywhere, BlueprintReadOnly)
    float Cooldown = 1.5f;
};

CSV インポート例

,DisplayName,Damage,Cooldown
WPN_Sword,"鋼の剣",15,1.2
WPN_Bow,"狩人の弓",12,0.9
WPN_Staff,"魔導の杖",8,2.0

Content Browser → Import → CSV → Row Struct: FWeaponRow を選ぶと、各行がそのまま Data Table の行として読み込まれます。

Blueprint からのアクセス

// C++ から行を引く
UDataTable* Table = WeaponTablePtr;
FWeaponRow* Row = Table->FindRow<FWeaponRow>(FName("WPN_Sword"), TEXT("Lookup"));
if (Row)
{
    UE_LOG(LogTemp, Log, TEXT("Damage = %d"), Row->Damage);
}

// 全行イテレート
TArray<FWeaponRow*> Rows;
Table->GetAllRows<FWeaponRow>(TEXT(""), Rows);

機能比較表

項目Data AssetData Table
単位1 ファイル = 1 オブジェクト1 ファイル = N 行
編集Asset Editor (1 個ずつ)表形式 + CSV インポート
外部ツール連携限定的★ Excel / Google Sheets
型安全★ コンパイル時に保証USTRUCT 経由なので OK だが CSV ミスは実行時
個別差分管理 (Git)★ ファイル単位で diff しやすい1 ファイルに集中するのでコンフリクト多
Soft Reference★ TSoftObjectPtr 自然に持てる持てるが Table 全体がロードされやすい
Asset Manager★ Primary Asset として管理可テーブル自体は 1 アセット
ローカライズFText 単位StringTable 連携が容易

Asset Manager との連携 (Data Asset の強み)

Primary Data Asset として登録すると、Asset Manager がロード/アンロードをまとめて管理できます。ステージで使う武器だけを動的にロードするなど、メモリ最適化に有利。

// Project Settings -> Asset Manager
// Primary Asset Types to Scan:
//   - Primary Asset Type: Weapon
//   - Asset Base Class:   /Script/MyGame.WeaponDataAsset
//   - Directory:          /Game/Data/Weapons

// 非同期ロード
UAssetManager& Mgr = UAssetManager::Get();
TArray<FName> Bundles = { TEXT("Combat") };
Mgr.LoadPrimaryAsset(
    FPrimaryAssetId("Weapon", "WPN_Sword"),
    Bundles,
    FStreamableDelegate::CreateLambda([](){
        // ロード完了後の処理
    })
);

実務での併用パターン

「定数表は Data Table、リッチなアセット参照は Data Asset」が無難な落とし所です。

[DT_WeaponStats]    <- Excel から一括バランス調整 (Damage, Cooldown, etc)
   |
   |  Row ID = WPN_Sword
   v
[DA_Weapon_Sword]   <- 個別アセット (メッシュ / アニメ / VFX)
   - Mesh:   SK_Sword
   - Anim:   ABP_Sword
   - Sound:  SFX_SwordSwing

FAQ

Q: パフォーマンスはどちらが良い?
A: ランタイムの行検索なら Data Table の FindRow は TMap で O(1)。Data Asset を都度ロードするより、Asset Manager + Primary Asset の方が制御しやすいです。

Q: ローカライズしたい
A: 両方 FText を使えますが、Data Table は StringTable Reference 列を持たせて参照する設計が一般的です。

Q: ホットリロードできる?
A: Data Table は CSV 再インポートで即反映。Data Asset はファイル単位で再ロード。エディタ実行中の動的差替は Re-Import で対応できます。