topaz-dev’s

ああああああ

連番のスクリプタブルオブジェクト

連番でスクリプタブルオブジェクトを生成する。

ディレクトリに存在するアセットの数を確認してインクリメントした名前のスクリプタブルオブジェクトを生成する。 CreateInstanceで生成したインスタンスは別の名前で新しくスクリプタブルオブジェクトを生成することができないため、一度スクリプタブルオブジェクトを生成したら新しくインスタンスを生成しなくてはならない。

youtu.be

public class SOGeneratorWindow : EditorWindow
{
    // スクリプタブルオブジェクト生成用のウィンドウを表示する
    [MenuItem("MyWindow/Open")]
    public static void ShowWindow()
    {
        SOGeneratorWindow window = EditorWindow.GetWindow<SOGeneratorWindow>();
        window.Show();

    }

    // 別で作成したスクリプタブルオブジェクトを継承したクラス
    private CharaParam _charaParam;
    private void OnGUI()
    {
        if (_charaParam == null) _charaParam = CreateInstance<CharaParam>();

        // ここからパラメタを設定するためのフィールドを表示する
        using (var h = new EditorGUILayout.HorizontalScope())
        {
            EditorGUILayout.LabelField("名前", GUILayout.Width(50));
            _charaParam._name = EditorGUILayout.TextField(_charaParam._name);
        }
        using (var h = new EditorGUILayout.HorizontalScope())
        {
            EditorGUILayout.LabelField("最大HP", GUILayout.Width(50));
            _charaParam._maxHP = EditorGUILayout.IntField(_charaParam._maxHP);
        }
        using (var h = new EditorGUILayout.HorizontalScope())
        {
            EditorGUILayout.LabelField("スピード", GUILayout.Width(50));
            _charaParam._speed = EditorGUILayout.IntField(_charaParam._speed);
        }



         // ここからスクリプタブルオブジェクトを生成するボタンを表示する。
        using (var h = new GUILayout.HorizontalScope())
        {
            if (GUILayout.Button("スクリプタブルオブジェクトを作成する"))
            {
                Debug.LogWarning("作成します");
                CreateSOParam();
            }
            if (GUILayout.Button("リセット", GUILayout.MaxWidth(30)))
            {
                ResetInstance();
            }
        }
    }

    // スクリプタブルオブジェクトを生成する
    private void CreateSOParam()
    {
        // Assets以下のpathを指定する
        var path = "/Data/CharaParam";
        // Application.dataPath : プロジェクトのパス/Assets
        var dir = Application.dataPath + path;  
        // ディレクトリがなければ生成する
        if (!Directory.Exists(dir))
        {
            Debug.LogWarning("ディレクトリを生成します");
            var info = Directory.CreateDirectory(dir);
            AssetDatabase.Refresh();
        }
        // 現在生成されているスクリプタブルオブジェクトの数を数える
        int cnt = Directory.GetFiles(dir)
                    .Where(name => name.Substring(name.Length - 4).Equals("meta"))
                    .Count();
         // 新しく作るスクリプタブルオブジェクトの名前(番号)を決定する
        var fileName = "CharaParam" + String.Format("{0:0000}", cnt + 1);
        // .asset拡張子として生成する
        AssetDatabase.CreateAsset(_charaParam, "Assets" + path + "/" + fileName + ".asset");
        ResetInstance();
        // 生成を反映する
        AssetDatabase.Refresh();
    }
    // 新しくインスタンスを生成する。現在の値をコピーしておく。
    private void ResetInstance()
    {
        var tmp = _charaParam;
        _charaParam = CreateInstance<CharaParam>();
        _charaParam._name = tmp._name;
        _charaParam._maxHP = tmp._maxHP;
        _charaParam._speed = tmp._speed;

    }
}
まとめ

fileNameの部分を変えることで、好きな名前のスクリプタブルオブジェクトを生成することができる。