スポンサーリンク

【Unity】ScriptableObjectで敵のデータを管理する

Unity

ScriptableObjectとは

ScriptableObjectは、ゲーム中で基本的に変わることのない値などを、格納しておくUnity独自のクラスになります。

使い道としては、ゲームに出てくる敵のパラメータや、ゲームのバランス調整用の設定などを格納しておくときに使います。

使い方

using UnityEngine;

[CreateAssetMenu(menuName = "ScriptableObject/EnemyData")]
public class EnemyData : ScriptableObject   //ScriptableObjectを継承する
{
    public string id;          //登録ID

    public string charName;    //キャラクターの名前

    public float hp;           //体力
    public float strength;     //攻撃力
    public float defence;      //防御力
    public float speed;        //素早さ
}

ScriptableObjectは、クラスに継承させることで実装することが出来ます!

[CreateAssetMenu(menuName = "ScriptableObject/EnemyData")]

クラスの上に書かれているこのコードは、上の画像のように、右クリックで出てくるメニューから、ScriptableObjectのアセットを生成できるようにするコードです。

Projectタブで右クリックして、先ほど実装したScriptableObjectのファイルを選択すると、画像のように、ScriptableObjectアセットが作成されます。

中身は、さっき実装した、IDや名前、ステータスが入っています。

これで、ScriptableObjectを作成することが出来ました!

敵にScriptableObjectのデータを持たせる

using UnityEngine;

//スライムクラス
public class Slime : MonoBehaviour
{
    public EnemyData _enemyData;
}

スライムクラスを作成して、EnemyDataの変数_enemyDataを定義しました。

先ほど作成した、SlimeのScriptableObjectをSlimeコンポーネントのEnemyDataに設定します。

これで、Slimeにステータスの情報が保存されている場所の情報を渡すことが出来ました。

なぜ直接クラスに情報を持たせないのか

using UnityEngine;

//スライムクラス
public class Slime : MonoBehaviour
{
    public string id;          //登録ID

    public string charName;    //キャラクターの名前

    public float hp;           //体力
    public float strength;     //攻撃力
    public float defence;      //防御力
    public float speed;        //素早さ
}

正直、まわりくどいことをしなくても、直接スライムにステータスを持たせればいいと思うのは、自然なことだと思います。僕自身も、ゲーム作りを始めたての頃は、同じように情報を持たせていました。

ですが、このコードのままだと出てくる問題があるので、順を追って解説していきます!

スライムがいる左の枠をゲーム画面、右のマス目がある枠をパソコンの処理の容量だと思って下さい!

この画像では、ゲーム上のスライムは、見た目だけ実装されている状態です。

なので、右のマスの中には、スライムの見た目データだけが格納されています。

次に、スライムにステータス情報を持たせます!

ステータスの情報を持たせたので、右の容量にステータスの情報が追加されました。

さらに、まったく同じスライムを3体増やしてみます。

スライムの数が増えたことで、右の容量にもスライムの基本データとステータスの情報が追加されました。

3体追加しただけで一番下の段が埋まってしまいました。

このままいくと、ゲーム上には、最高でも16体しか出せなくなってしまいます。

もう少しスライムの数を増やしたいと思った時に、現状では16体以上増やすことが出来ません。

何か削れるものがあれば、削って容量を増やしたいのですが、削れるものと言っても、スライム自体を減らすわけにもいかないので、さっき追加したステータスの情報しか削れるものがありません。

ここで登場するのが、ScriptableObjectです!

ステータスの情報をScriptableObjectで作成することで、ステータスの情報は、ゲームに1つだけしか存在しないことになります。

スライムたちが、1つのステータスの情報を共有して使うことで、大幅に容量の削減が出来ます!

このように、ScriptableObjectで管理することで、データの無駄な肥大化を防ぐことが出来るので、クラスに直接データを持たせるのではなくて、ScriptableObjectとして作成しておいて、それを使うのがいいのかなと思います!

お疲れさまでした!

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