【Unity×C#】ScriptableObjectでデータ管理がめっちゃ楽になる話

当ブログではアフィリエイト広告を含みます
Unity

「ScriptableObjectでデータ管理が楽になる」という話に興味はありますでしょうか?

そもそもScriptableObjectとは、ひとことで言うと、「使いまわせるデータをアセットとして保存できる機能」です。
スクリプトなのに、プレハブでもなく、シーンに置かなくてもいい——そんな不思議で便利なデータ容器のことです。

ScriptableObjectの活躍場面

  • キャラクターのステータスや属性をまとめたい(HP、攻撃力、スピードなど)
  • アイテムの一覧を管理したい(名前・説明・画像・効果など)
  • 敵ごとの行動パターンや耐性をデータ化して再利用したい
  • ステージ設定をアセット化して、複数のシーンで使いまわしたい

RPGなら「回復薬」「毒消し草」などのアイテムデータ
アクションゲームなら「スライム」「ドラゴン」などの敵キャラの設定
タワーディフェンスなら「Waveの構成」や「出現タイミング」など、ゲームの静的データといった、所謂「マスターデータ」をScriptableObjectにまとめておくと、管理がとてもラクになります。

ScriptableObjectの作り方

それでは、実際にScriptableObjectを作ってみましょう。
今回は、アイテムデータをScriptableObjectとして定義していきます。

① ScriptableObjectのクラスを作る

using UnityEngine;

[CreateAssetMenu(menuName = "MyGame/ItemData")]
public class ItemData : ScriptableObject
{
    public string itemName = "賢人パン";
    public Sprite icon;
    public int power = 10;
}
  • 【重要】ScriptableObject を継承することで、「アセット化可能なスクリプト」になります。
  • [CreateAssetMenu] を付加しておくと、エディタから右クリックで .asset を新規作成できるようになります。
  • itemNamepower は、インスペクターで直接編集可能。

② アセットを作成する

  1. Unityエディタの Project ウィンドウで右クリック
  2. Create > MyGame > ItemData を選ぶ
  3. HealingItem.asset のように名前をつけて保存
  4. インスペクター上で itemNamepower を編集!

これで、スクリプトではなく.assetファイルとして保存されたゲームデータの完成です!

ScriptableObjectを使ってゲームに組み込む

作ったアイテムデータを、ゲーム内でどう使うのか? 実際の例を見てみましょう。

③ 参照するスクリプトを書く

using UnityEngine;
using UnityEngine.UI;

public class ItemDisplay : MonoBehaviour
{
    public ItemData itemData;  //.assetファイル
    public Text nameText;    //アイテム名表示用テキスト
    public Image iconImage;  //アイコン表示用画像

    void Start()
    {
        nameText.text = itemData.itemName;
        iconImage.sprite = itemData.icon;
        Debug.Log($"アイテム「{itemData.itemName}」の回復力は {itemData.power} です");
    }
}
  • public ItemData itemData; とすることで、インスペクターに .asset をドラッグ&ドロップできます。さきほど作成した HealingItem.asset を設定してみましょう。
  • itemData の内容を反映するUIパーツ(TextやImage)はCanvas下に作っておいて下さい。
  • デバッグログで、アイテムの性能を出力しています。
    • 出力例:アイテム「賢人パン」の回復力は 10 です

MonoBehaviourと何が違うの?

ScriptableObjectはシーンに存在しません。
故に、Update() などのコールバックも動きません。シーンにアタッチせずに、データファイルとして存在しますので、あくまで「設定ファイル」や「テンプレート」のような使い方がメインです。

その代わり、複数のオブジェクトで共有できる&変更しても反映しやすいという大きなメリットがあります。

まとめ:データを制す者は開発を制す!

  • ScriptableObjectは「再利用できるデータファイル」だと覚えよう
  • CreateAssetMenu を使えば、右クリックでサクサク作れる
  • ゲーム中のあらゆる設定値をアセットとして切り出せるので、保守・調整が超ラクに

「まだ難しそう…」と思った方も、1つ作って動かしてみれば「あ、便利!」と感じられるはずです。


過去に旧ブログで「ExcelファイルのデータをScriptableObject化するアセット」の紹介を行っています。興味があればそちらも合わせてどうぞ!
【Unity】ExcelのxlsxファイルをScriptable Objectとして読み込む神パッケージ

タイトルとURLをコピーしました