Unityで学ぶ ScriptableObject入門

広告

「データだけを保存する箱」を作ろう

Unityでゲームを作っていると、

  • プレイヤーのHP
  • 武器の攻撃力
  • アイテム名
  • 敵のステータス

など、「設定値」をたくさん扱うようになります。

最初は、

public int hp = 100;

のように直接書いていても問題ありません。

ですが、ゲームが大きくなると、

  • 同じデータを複数の場所で使いたい
  • Inspectorから簡単に変更したい
  • コードを書き換えずに調整したい

という場面が増えてきます。

そこで登場するのが、

ScriptableObject

です。


ScriptableObjectとは?

簡単に言うと、

「データだけを保存するための仕組み」

です。

例えば:

保存したいものScriptableObject向き?
武器の攻撃力
アイテム名
最大HP
敵の移動処理×

つまり、

  • 「動き」
    ではなく、
  • 「設定値」

を保存するために使います。


今回作るもの

今回は、

モンスター設定データ

を作ります。

例えば:

モンスター最大HP攻撃力
スライム103
ゴブリン308
ドラゴン30050

このようなデータを、
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スライム
HP10
Attack3

Dragon.asset

項目
Monster Nameドラゴン
HP300
Attack50

データを使ってみる

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 300HP 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を使うと、

  • モンスター
  • 武器
  • アイテム

などの設定データを、
整理して管理しやすくなります。

まずは今回のような、
シンプルなデータ管理から試してみましょう。

訪問数 19 回, 今日の訪問数 19回

広告

ScriptableObject,Unity

Posted by hidepon