Unityで学ぶ ScriptableObject入門
「データだけを保存する箱」を作ろう
Unityでゲームを作っていると、
- プレイヤーのHP
- 武器の攻撃力
- アイテム名
- 敵のステータス
など、「設定値」をたくさん扱うようになります。
最初は、
public int hp = 100;
のように直接書いていても問題ありません。
ですが、ゲームが大きくなると、
- 同じデータを複数の場所で使いたい
- Inspectorから簡単に変更したい
- コードを書き換えずに調整したい
という場面が増えてきます。
そこで登場するのが、
ScriptableObject
です。
ScriptableObjectとは?
簡単に言うと、
「データだけを保存するための仕組み」
です。
例えば:
| 保存したいもの | ScriptableObject向き? |
|---|---|
| 武器の攻撃力 | ○ |
| アイテム名 | ○ |
| 最大HP | ○ |
| 敵の移動処理 | × |
つまり、
- 「動き」
ではなく、 - 「設定値」
を保存するために使います。
今回作るもの
今回は、
モンスター設定データ
を作ります。
例えば:
| モンスター | 最大HP | 攻撃力 |
|---|---|---|
| スライム | 10 | 3 |
| ゴブリン | 30 | 8 |
| ドラゴン | 300 | 50 |
このようなデータを、
Inspectorから管理できるようにします。
ScriptableObjectを作る
MonsterData.cs
using UnityEngine;
[CreateAssetMenu(fileName = "MonsterData",
menuName = "Game/Monster Data")]
public class MonsterData : ScriptableObject
{
public string monsterName;
public int hp;
public int attack;
}
ポイント解説
ScriptableObjectを継承
: ScriptableObject
これで、
「このクラスはデータ保存用です」
とUnityに伝えています。
CreateAssetMenu
[CreateAssetMenu]
これを付けると、
Unityの右クリックメニューから
データを作れるようになります。
Unityで作成してみる
① スクリプト保存
MonsterData.cs
を保存します。
② Projectビューで右クリック
Create
↓
Game
↓
Monster Data
を選択。
③ データファイルが生成される
例えば:
Slime.asset
を作成できます。
Inspectorで設定してみる
Slime.asset
| 項目 | 値 |
|---|---|
| Monster Name | スライム |
| HP | 10 |
| Attack | 3 |
Dragon.asset
| 項目 | 値 |
|---|---|
| Monster Name | ドラゴン |
| HP | 300 |
| Attack | 50 |
データを使ってみる
MonsterViewer.cs
using UnityEngine;
public class MonsterViewer : MonoBehaviour
{
[SerializeField]
private MonsterData monsterData;
private void Start()
{
Debug.Log(monsterData.monsterName);
Debug.Log("HP : " + monsterData.hp);
Debug.Log("攻撃力 : " + monsterData.attack);
}
}
Unity側の設定
GameObjectに
MonsterViewer
を追加します。
そして、
Inspectorの
Monster Data
欄に、
Slime.asset
をドラッグ&ドロップします。
実行結果
スライム
HP : 10
攻撃力 : 3
ScriptableObjectのメリット
① データを共有できる
例えば:
- 敵生成
- UI表示
- バトル処理
など、複数の場所で同じデータを使えます。
② Inspectorで調整できる
例えば:
| 修正前 | 修正後 |
|---|---|
| HP 300 | HP 500 |
コードを書き換えなくても変更できます。
③ データ整理しやすい
「設定値」をまとめて管理しやすくなります。
重要ポイント
ScriptableObjectは「元データ」
として使うことが多いです。
例えば:
| 種類 | 例 |
|---|---|
| 元データ | 最大HP |
| 実行中状態 | 現在HP |
実行中に変わる値は?
通常は、
別の変数にコピー
して使います。
例
Monster.cs
using UnityEngine;
public class Monster : MonoBehaviour
{
[SerializeField]
private MonsterData monsterData;
private int currentHp;
private void Start()
{
currentHp = monsterData.hp;
}
public void Damage(int amount)
{
currentHp -= amount;
Debug.Log(currentHp);
}
}
なぜコピーするの?
例えば:
monsterData.hp -= 10;
のように直接変更すると、
元データまで変更される場合がある
ためです。
そのため、
| 種類 | 管理 |
|---|---|
| 元データ | ScriptableObject |
| 実行中の状態 | 通常変数 |
という分け方をすることが多いです。
まとめ
ScriptableObjectとは
「データだけを保存するための仕組み」
です。
今回のポイント
| ポイント | 内容 |
|---|---|
| ScriptableObject | データ保存用 |
| assetファイル | 実際の保存データ |
| Inspector | 値を調整できる |
| 実行中の値 | 別変数で管理 |
最後に
Unityでは、
- 見た目
- 動き
- データ
を分けて管理することが重要になってきます。
ScriptableObjectを使うと、
- モンスター
- 武器
- アイテム
などの設定データを、
整理して管理しやすくなります。
まずは今回のような、
シンプルなデータ管理から試してみましょう。



ディスカッション
コメント一覧
まだ、コメントがありません