카테고리 없음
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");
}
}
★☆☆☆☆
반응형