using System.Collections; using System.Collections.Generic; using UnityEngine; using System.Linq; using System.IO; using System; #if UNITY_EDITOR using UnityEditor; [CustomEditor(typeof(Database))] public class DatabaseEditor : Editor { public override void OnInspectorGUI() { DrawDefaultInspector(); if (GUILayout.Button("fetch assets")) { var targ = target as Database; foreach (var folder in targ.Folders) { var path = AssetDatabase.GetAssetPath(folder); foreach (var file in GetAllPaths(path)) { var scriptableObject = AssetDatabase.LoadAssetAtPath(file); if (scriptableObject && !targ.ScriptableObjects.Contains(scriptableObject)) { targ.ScriptableObjects.Add(scriptableObject); } var prefab = AssetDatabase.LoadAssetAtPath(file); if (prefab && !targ.Prefabs.Contains(prefab)) { targ.Prefabs.Add(prefab); } } } } } string[] GetAllPaths(string target) { var files = Directory.GetFiles(target).ToList(); foreach (var dir in Directory.GetDirectories(target)) { files.AddRange(GetAllPaths(dir)); } return files.ToArray(); } } #endif public class Database : SingletonBehaviour { public const string TYPE = nameof(TYPE); [Serializable] public class DataList : IEnumerable where T : UnityEngine.Object { [SerializeField] private List elements; public DataList() => elements = new List(); public T this[string key] => elements.Find(x => x.name == key); public void Add(T element) => elements.Add(element); public IEnumerator GetEnumerator() { return elements.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return elements.GetEnumerator(); } public static implicit operator DataList(List list) => new DataList() { elements = list }; } [SerializeField] private List _prefabs; [SerializeField] private List _scriptableObjects; public DataList Prefabs => _prefabs; public DataList ScriptableObjects => _scriptableObjects; public Database() { _prefabs = new List(); _scriptableObjects = new List(); } [Header("Editor section")] [SerializeField] private List _folders; public List Folders => _folders; }