(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

シーンにあるオブジェクトのデータを保存し、別シーンで利用する【Unity】【エディタ拡張】


このエントリーをはてなブックマークに追加

はじめに

この記事は、前回の記事の続きというか発展版になります!
また、前回同様GitHubにプロジェクトをあげました!上げたかっただ(ry

今回の目的は、「インスペクター上で設定した値をデータファイルに保存し、そのデータから別シーンに同じものを生成する」です。
今回もモンスターの能力で説明すると、設定用シーンで各モンスターの能力を設定し、本番用シーンで設定したのと同じモンスターを生成するといった具合です。

最初から本番用シーンで設定すればいい気がするのですが、ステージ制のゲームなどはシーン数が膨大になりがちなので、それを防げたらなーという思惑があったりなかったり…
あと、Prefab化を忘れて各モンスターの細部の変更が面倒!という場合とかにも良いんではないでしょうか。まぁそんなことあるわけないか '`,、('∀`) '`,、


流れ

今回の流れは

1.モンスターの保存する値を定義したMonsterDataクラス(ScriptableObjectを継承)を作成
2.エディタ拡張を使って、シーン上のモンスターの設定値をMonsterData形式で保存
3.保存されたデータを読み込みモンスターを生成。

となっております。


MonsterData

まずはモンスターの保存する値を定義します。
これにはScriptableObjectというものを使います。

ScriptableObject

まずScriptableObjectってなんぞや?って話ですが、「読み込み専用の固定データ」みたいな感じです。
モンスターの能力など、ゲーム中には変更しないが、どこかに保持しておきたいデータなどに使えます。

細かい事はこちらで!マルナゲ!

MonsterData

先ほどの記事を参考に作ったMonsterDataは以下の通りです。

Paramにモンスターの設定値を保存し、listにそれぞれのモンスターのParamを保存します。


MonsterDataMaker

次にMonsterData形式のデータを自動で作成するエディタ拡張のコードが以下の通りです。



これを[Editor]フォルダ以下におき、シーン再生中に[Tools]-[Create]-[Monster Data]を実行すると[Resources]-[Data]以下にMonsterData形式のデータが生成されます。

また、作成されるデータ名は[シーン名].assetです。
ちなみに、シーン再生中でないとうまくシーン名が取得できませんでした…

f:id:kan_kikuchi:20141221194716p:plain

さらに、[Scenes]-[Setting]以下のシーンが変更された時は自動でデータが生成されます。

f:id:kan_kikuchi:20141221194657p:plain

以下、コード説明です。

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化は忘れずやりましょう!!!!