using System.Collections; using System.Collections.Generic; using UnityEngine; using System.Linq; using System.IO; using System; #if UNITY_EDITOR using UnityEditor; [CustomEditor(typeof(DatabaseSO))] public class DatabaseEditor : Editor { public override void OnInspectorGUI() { DrawDefaultInspector(); if (GUILayout.Button("fetch assets")) { var targ = target as DatabaseSO; foreach (var folder in targ.Folders) { var path = AssetDatabase.GetAssetPath(folder); foreach (var file in GetAllPaths(path)) { var scriptableObject = AssetDatabase.LoadAssetAtPath(file); if (scriptableObject && !Database.Instance.ScriptableObjects.Contains(scriptableObject)) { Database.Instance.ScriptableObjects.Add(scriptableObject); } var prefab = AssetDatabase.LoadAssetAtPath(file); if (prefab && !Database.Instance.Prefabs.Contains(prefab)) { Database.Instance.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 [Serializable] public class Database : Singleton { [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(); } } [CreateAssetMenu(menuName = "Gather And Defend/Database")] public class DatabaseSO : ScriptableObject { [SerializeField] private Database database = Database.Instance; [Header("Editor section")] [SerializeField] private List _folders; public List Folders => _folders; }