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として作成しておいて、それを使うのがいいのかなと思います!
お疲れさまでした!