前回、プログラムの中に prefab のパスの配列を作ってました。
そのままでは、取り回しが悪いので asset ファイルに逃がす方法を解説します。
前回かんたんだった反動で、今回はちょっと複雑です。
Entityとそれのリスト
今回は、最終的に以下のような List を持ったアセットファイルを作ります。
![](https://program.enakko.net/wp-content/uploads/2021/04/unity-scriptableobject1-edit.png)
まずは、prefab のパスを格納するクラスを作ります。
名前は EnemyEntity とします。
public なクラスとして、Serializable 属性をつけ、public なフィールドを保持します。
次に EnemyEntity の List を持つクラスを作成
名前は EnemyTable としました。(MasterDataEnemies でもいいかもしれない)
これはアセットファイル化するため ScriptableObject を継承します。
また、List にも SerializeField 属性。
![](https://program.enakko.net/wp-content/uploads/2021/04/unity-scriptableobject3-entity-list.png)
メニューからファイル生成
asset を吐き出すために一つ仕掛けをしています。
class につけた CreateAssetMenu 属性がそれ。
これをつけると、UnityEditor の上部メニューを拡張して、この ScriptableObject の新規アセットファイルを1つ作成できるようになります。
![](https://program.enakko.net/wp-content/uploads/2021/04/unity-scriptableobject4-menu.png)
込み入ったビルド構成で CreateAssetMenu がコンパイルエラーになる場合は Editorという特別な名前のフォルダー以下に .cs を置く必要があることも
ScriptableObject を読み込む方法
さて、先程の独自メニューから EnemyTable のアセットファイルを作ってください。
リストの中身をインスペクターで編集したら、
スクリプトから読み込める位置にファイルを移動しておきます。
今回は Resources/MasterData/EnemyTable.asset に置いたとして、
EnemyTable 型の変数へ読み込むのはかんたんです。
![](https://program.enakko.net/wp-content/uploads/2021/04/unity-scriptableobject5-load.png)
あとは前回の generateEnemy を以下のように書き直します。
![](https://program.enakko.net/wp-content/uploads/2021/04/unity-scriptableobject6.png)
※前回と比べて HitPoint を設定するのに Initialize というメソッドを用意しています。
コードがだいぶスッキリしました。
以上が、ScriptableObject を使ってプログラムとデータを分離する方法の解説でした。