クリックゲーム開発

#6.ScriptableObjectを使ってプログラムとデータを分離する方法

Unity ScriptableObject

前回、プログラムの中に prefab のパスの配列を作ってました。

そのままでは、取り回しが悪いので asset ファイルに逃がす方法を解説します。
前回かんたんだった反動で、今回はちょっと複雑です。

Entityとそれのリスト

今回は、最終的に以下のような List を持ったアセットファイルを作ります。

まずは、prefab のパスを格納するクラスを作ります。

名前は EnemyEntity とします。

public なクラスとして、Serializable 属性をつけ、public なフィールドを保持します。


次に EnemyEntity の List を持つクラスを作成
名前は EnemyTable としました。(MasterDataEnemies でもいいかもしれない)
これはアセットファイル化するため ScriptableObject を継承します。

また、List にも SerializeField 属性。

メニューからファイル生成

asset を吐き出すために一つ仕掛けをしています。

class につけた CreateAssetMenu 属性がそれ。
これをつけると、UnityEditor の上部メニューを拡張して、この ScriptableObject の新規アセットファイルを1つ作成できるようになります。

込み入ったビルド構成で CreateAssetMenu がコンパイルエラーになる場合は Editorという特別な名前のフォルダー以下に .cs を置く必要があることも

ScriptableObject を読み込む方法

さて、先程の独自メニューから EnemyTable のアセットファイルを作ってください。
リストの中身をインスペクターで編集したら、
スクリプトから読み込める位置にファイルを移動しておきます。

今回は Resources/MasterData/EnemyTable.asset に置いたとして、
EnemyTable 型の変数へ読み込むのはかんたんです。

あとは前回の generateEnemy を以下のように書き直します。

※前回と比べて HitPoint を設定するのに Initialize というメソッドを用意しています。

コードがだいぶスッキリしました。

以上が、ScriptableObject を使ってプログラムとデータを分離する方法の解説でした。