動的にScriptableObjectを生成する - (Unity初心者)
はじめに
敵の設定パラメーターやステージ情報などのゲーム実行時には変わらないデータを格納するのに便利なScriptableObject。
今回はこのScriptableObjectを動的に(処理を書いて自動で)プロジェクトのアセットに作成する。
コード全体
#if UNITY_EDITOR
using UnityEditor;
#endif
namespace Myfolder.DataBese
{
public class StageCreator
{
private const string GENERATE_STAGE_ASSETPATH = "Assets/Myfolder/DataBase/generateStage";
public static void CreateStageAsset(Stage _generateStage)
{
#if UNITY_EDITOR
// 同一ファイル名が被らないようにする
int fileCount = 1;
var assetPath = GENERATE_STAGE_ASSETPATH + $"/{fileCount}.asset";
while (AssetDatabase.LoadAssetAtPath<Stage>(assetPath) != null)
{
fileCount++;
assetPath = GENERATE_STAGE_ASSETPATH + $"/{fileCount}.asset";
}
// ScriptableObjectをアセットとして保存
AssetDatabase.CreateAsset(_generateStage, assetPath);
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
#else
Debug.LogError("This method should only be called in the Unity Editor.");
#endif
}
}
}
今回はステージの情報を書いているStageクラス(ScriptableObjectを継承)を動的に作成するCreateStageAsset関数を作成した。
生成したいStageクラス(自分が生成したいScriptableObjectを継承したクラス)を引数にする。
ちなみに#if UNITY_EDITORで書いておかないと、ビルドする際にエラーでる。
説明
private const string GENERATE_STAGE_ASSETPATH = "Assets/Myfolder/DataBase/generateStage";
作成したScriptableObjectを保存するパス。ディレクトリがなかったら後述する処理でエラーがでる。
// 同一ファイル名が被らないようにする
int fileCount = 1;
var assetPath = GENERATE_STAGE_ASSETPATH + $"/{fileCount}.asset";
while (AssetDatabase.LoadAssetAtPath<Stage>(assetPath) != null)
{
fileCount++;
assetPath = GENERATE_STAGE_ASSETPATH + $"/{fileCount}.asset";
}
アセットの名前。今回はただの数字。数字が被ってなかったら生成。被ってたら+1してもう一回。被らなくなるまでやる。
ちなみに同じ名前で保存すると上書きされる。
別に名前とか気にしないならDateTime.Nowで今の日付や時間を名前にしてもいいかもね。
// ScriptableObjectをアセットとして保存
AssetDatabase.CreateAsset(_generateStage, assetPath);
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
一番大事なところ。Unityエディタ内でのみ機能する。
CreateAssetで引数にしたStageクラスをassetPathに生成している。
SaveAssetsで保存。
Refreshでアセットブラウザを更新。作成したものをエディタに反映。
この処理を適当なところで呼び出す。
指定したディレクトリに生成されていたら完了!
参考
ScriptableObject - Unity マニュアル
コメント
コメントを投稿