動的に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 マニュアル



コメント