Unityで開発を進めていると、キャラクターのステータスやアイテムの情報など、たくさんのデータを管理する必要が出てきます。
そんなときに便利なのが 「ScriptableObject(スクリプタブルオブジェクト)」 です。
この記事では、初心者の方でもわかるように、
- ScriptableObjectとは何か
- どうやって作るのか
- どんなときに使うと便利なのか
を順番に解説します!
ScriptableObjectとは?
ScriptableObjectは、データを保存するための特別なクラスです。
通常のC#スクリプトとは違い、シーンに配置しなくても使えるのが大きな特徴です。
たとえば、以下のような場面で活躍します👇
- キャラクターのステータスを複数キャラ分まとめて管理したい
- アイテムや武器の情報を一覧で保存したい
- ゲームの設定値(難易度、スピードなど)をエディタ上で簡単に調整したい
ScriptableObjectを作ってみよう!
それでは実際にScriptableObjectを作ってみましょう。
ここでは「キャラクターのステータス」を例に説明します。
① スクリプトを作成する
まずは新しいC#スクリプトを作成し、名前を CharacterData.cs にします。
using UnityEngine;
[CreateAssetMenu(fileName = "NewCharacterData", menuName = "Game/Character Data")]
public class CharacterData : ScriptableObject
{
public string characterName;
public int hp;
public int attackPower;
}
ポイント解説 💡
ScriptableObjectを継承することで、スクリプタブルオブジェクトになります。[CreateAssetMenu]属性をつけると、Unityのメニューから簡単に作成できるようになります。
② アセットを作成する
- プロジェクトビューで右クリック
- 「Create > Game > Character Data」を選択
- 新しいアセットファイルが作成されます


“Game”の項目がなければ、Create > Update UXML Schemaをクリックして更新しましょう。
作成されたアセットをクリックすると、インスペクターで
名前・HP・攻撃力などを入力できます。

③ スクリプタブルオブジェクトを使う
次に、このデータを使うスクリプトを作ってみましょう。
using UnityEngine;
public class Character : MonoBehaviour
{
[SerializeField] private CharacterData characterData;
private void Start()
{
Debug.Log($"{characterData.characterName} のHPは {characterData.hp} です。");
}
}
このスクリプトをゲームオブジェクトにアタッチして、
インスペクターで characterData に作ったアセットをドラッグ&ドロップします。
ゲームを再生すると、コンソールにデータが表示されます!

ScriptableObjectを使うメリット
① シーンに依存しない
ScriptableObjectはシーンに配置しなくても存在できるので、
データをどのシーンからでも共有できます。
② データを整理しやすい
プレハブやスクリプトに埋め込むよりも、Projectウィンドウで一覧管理できて便利です。
ScriptableObjectが活躍する例
- アイテム管理
→ 武器や防具のパラメータをまとめる - 敵キャラのデータ
→ 種類ごとにステータスを切り替える - ゲーム設定
→ 難易度・音量などを調整可能にする
まとめ
| 項目 | 内容 |
|---|---|
| ScriptableObjectとは? | シーンに依存しないデータ保持用クラス |
| 作り方 | ScriptableObjectを継承して [CreateAssetMenu] をつける |
| メリット | データの共有・整理が簡単、メモリ効率も良い |
| 使いどころ | キャラデータ、アイテム、設定などに最適 |
ScriptableObjectを使うことで、データの管理がスッキリ整理できるようになります。
最初はちょっと抽象的に感じるかもしれませんが、
一度使いこなせるようになると、開発効率が一気に上がります!
