最初に
本記事は自分のチートシート用にまとめているため、端折っている部分が多々あります。
正確な情報をお求めの方は引用元のサイトをご覧ください。
概要
ゲームやアプリの中で変化せず、あちこちで共用するデータを格納する時に便利なクラス
たとえば、
・複数リスポーンする敵のパラメータ
・カードゲームのカードの名前、パワー、HP、スキル
個別のゲームオブジェクト等にアタッチはせず、都度アセットをロードして使用するため、メモリの節約になる。(これがメインの目的)
Scriptを生成したときに自動で継承されるMonoBehaviour
と同じ立ち位置
使い方
クラスの定義
using UnityEngine;
[CreateAssetMenu(menuName = "Card State")] //このクラスのアセットをメニューから作成する際のパスの定義
public class TileState : ScriptableObject
{
public string name;
public int power;
public int hp;
}
Start()関数とUpdate()関数は消しておくこと。
これらはMonoBehaviourで定義されていることからScriptableObjectでは使用できない。
解説
[CreateAssetMenu(menuName = "Card State")]
このクラスのアセットをメニューから作成する際のパスを定義する
上記の例だとUnity画面の Assets > Create > Card State より選択できるようになる
public class TileState : ScriptableObject
クラスの継承元は、いつものMonoBehaviour
からScriptableObject
に変更する
あとは自由に定義するだけ
構造体やクラスじゃダメ?
冒頭に記載した通り、構造体やクラスだと生成するゲームオブジェクトごとにアタッチする必要があるのでメモリの無駄使い
静的(Static)にすればアタッチ不要になるけど、オブジェクト生成前からメモリを消費するので同じくメモリの無駄使い(カードゲームを例に挙げれば、何百種類のカードのデータを静的に保持してたら大変なことになる。。。)
ポケモンもUnityをベースに作ってると聞いたことがあるけど、キャラクターごとの名前やデザイン、ステータスなどはScriptableObjectで定義されてるのかなあ、知らんけど
参考にしたサイト