카테고리 없음

Unity) Edtior ScriptableObject Singleton

테샤르 2022. 6. 13. 13:15

Edtior ScriptableObject Singleton

에디터에서 Scriptable Object를 사용하는 방식에서 Singleton형태로 Asset에서 로드하는 형식이다.

 

반응형
using System;
using UnityEngine;
using System.IO;
using UnityEditor;
using UnityEngine.Events;
using System.Runtime.CompilerServices;

/// <summary>
/// Editor ScriptableObject (최초한번 실행 이후에 instance 호출시 생성)
/// </summary>
/// <typeparam name="T"></typeparam>
public class SingletonEdtiorScriptableObject<T> : ScriptableObject where T : SingletonEdtiorScriptableObject<T>
{

    [HideInInspector]
    public UnityEvent Changed;

    static T _instance;
    public static T Instance => _instance ?? (_instance = LoadAsset());

    void OnValidate()
    {
        Changed?.Invoke();
    }

    private static T LoadAsset()
    {
        var path = GetAssetPath();
        var asset = AssetDatabase.LoadAssetAtPath<T>(path);

        if (asset == null)
        {
            asset = CreateInstance<T>();
            AssetDatabase.CreateAsset(asset, path);
            AssetDatabase.SaveAssets();
        }

        return asset;
    }

    private static string GetAssetPath([CallerFilePath] string callerFilePath = null)
    {
        var folder = Path.GetDirectoryName(callerFilePath);

#if UNITY_EDITOR_WIN
        folder = folder.Substring(folder.LastIndexOf(@"\Assets\", StringComparison.Ordinal) + 1);
#else
        folder = folder.Substring(folder.LastIndexOf("/Assets/", StringComparison.Ordinal) + 1);
#endif

        return Path.Combine(folder, "CustomHierarchyScriptable.asset");
    }
}

 

 

★☆☆☆☆

 

반응형