コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【Unity】ScriptableObject を CreateAssetMenu を使わずに生成できるようにする

ソースコード

using UnityEditor;
using UnityEngine;

namespace Kogane.Internal
{
    [InitializeOnLoad]
    internal static class ScriptableObjectCreatorOnInspector
    {
        static ScriptableObjectCreatorOnInspector()
        {
            Editor.finishedDefaultHeaderGUI -= OnGUI;
            Editor.finishedDefaultHeaderGUI += OnGUI;
        }

        private static void OnGUI( Editor editor )
        {
            if ( !EditorUtility.IsPersistent( editor.target ) ) return;

            var assetPath = AssetDatabase.GetAssetPath( editor.target );
            var type      = AssetDatabase.GetMainAssetTypeAtPath( assetPath );

            if ( type != typeof( MonoScript ) ) return;

            var monoScript = AssetDatabase.LoadAssetAtPath<MonoScript>( assetPath );

            if ( monoScript == null ) return;

            var classType = monoScript.GetClass();

            if ( classType == null ) return;

            var isScriptableObject = classType.IsSubclassOf( typeof( ScriptableObject ) );

            if ( !isScriptableObject ) return;
            if ( !GUILayout.Button( "Create Asset" ) ) return;

            var fullPath = EditorUtility.SaveFilePanel
            (
                title: "",
                directory: "Assets",
                defaultName: classType.Name,
                extension: "asset"
            );

            if ( string.IsNullOrWhiteSpace( fullPath ) ) return;

            var relativePath = FileUtil.GetProjectRelativePath( fullPath );
            var instance     = ScriptableObject.CreateInstance( classType );

            AssetDatabase.CreateAsset( instance, relativePath );
            AssetDatabase.Refresh();
        }
    }
}

使用例

ScriptableObject のスクリプトの Inspector に表示される「Create Asset」を押すと
その ScriptableObject のアセットを作成できます