はじめに
この記事は、前回の記事の続きというか発展版になります!
また、前回同様GitHubにプロジェクトをあげました!上げたかっただ(ry
今回の目的は、「インスペクター上で設定した値をデータファイルに保存し、そのデータから別シーンに同じものを生成する」です。
今回もモンスターの能力で説明すると、設定用シーンで各モンスターの能力を設定し、本番用シーンで設定したのと同じモンスターを生成するといった具合です。
最初から本番用シーンで設定すればいい気がするのですが、ステージ制のゲームなどはシーン数が膨大になりがちなので、それを防げたらなーという思惑があったりなかったり…
あと、Prefab化を忘れて各モンスターの細部の変更が面倒!という場合とかにも良いんではないでしょうか。まぁそんなことあるわけないか '`,、('∀`) '`,、
流れ
今回の流れは
1.モンスターの保存する値を定義したMonsterDataクラス(ScriptableObjectを継承)を作成
2.エディタ拡張を使って、シーン上のモンスターの設定値をMonsterData形式で保存
3.保存されたデータを読み込みモンスターを生成。
となっております。
MonsterData
まずはモンスターの保存する値を定義します。
これにはScriptableObjectというものを使います。
ScriptableObject
まずScriptableObjectってなんぞや?って話ですが、「読み込み専用の固定データ」みたいな感じです。
モンスターの能力など、ゲーム中には変更しないが、どこかに保持しておきたいデータなどに使えます。
細かい事はこちらで!マルナゲ!
MonsterDataMaker
次にMonsterData形式のデータを自動で作成するエディタ拡張のコードが以下の通りです。
これを[Editor]フォルダ以下におき、シーン再生中に[Tools]-[Create]-[Monster Data]を実行すると[Resources]-[Data]以下にMonsterData形式のデータが生成されます。
また、作成されるデータ名は[シーン名].assetです。
ちなみに、シーン再生中でないとうまくシーン名が取得できませんでした…
さらに、[Scenes]-[Setting]以下のシーンが変更された時は自動でデータが生成されます。
以下、コード説明です。
OnPostprocessAllAssets
スクリプトでもシーンでも画像ファイルでも、とにかくAsset内のデータが変更された時に呼ばれます。
今回は変更された中でも特定のディレクトリ以下のモノの時だけMonsterDataを作成するようにしています。
MenuItem
[MenuItem(COMMAND_NAME)]以下に書かれたコードをCOMMAND_NAMEで指定されたボタンを押した時に実行するようにします。
AssetDatabase
AssetDatabaseはプロジェクトのアセットにアクセスできる API です。アセットを見つけてロードするメソッドがあり、さらにアセットを作成、削除、修正できるメソッド等々があります。
だそうです!!!!!(手抜き)
今回はこれを使ってMonsterDataの削除及び作成を行っています。
シーンの全オブジェクトを取得
以下の記事を参考にしています。
以下のコードでProjectも含めた全ゲームオブジェクトを取得し
GameObject[] gameobjects = Resources.FindObjectsOfTypeAll<GameObject> ();
gameobject.activeInHierarchyでHierarchyに設定されているオブジェクトかを判定しています。
MonsterMaker
最後に生成したデータからモンスターを生成するMonsterMakerのコードが以下の通りです。
GitHubにあがってるプロジェクトではこれをGameシーンのMain Cameraにアタッチして起動時にモンスターを生成するようにしています。
現状データは一つしかありませんが、これを各ステージ毎に作成すれば読み込むファイルを変えるだけで、設定するモンスターの能力を変えられるようになります!
また、コード中にもありますが、ScriptableObject形式の読み込みは
MonsterData monsterData = Resources.Load<MonsterData> (MONSTER_DATA_PATH + stageNo);
とResources.Loadを使って行えます。
おわりに
長い割に使い道があるか分からないものになりました…
とりあえずPrefab化は忘れずやりましょう!!!!