using System.Collections; using System.Collections.Generic; using UnityEngine; using System.Linq; using System.IO; using System; using Unity.VisualScripting.YamlDotNet.Core.Tokens; #if UNITY_EDITOR using UnityEditor; #endif /// /// cette classe sert à réunir les prefabs et les scriptable objects importants.
/// Elle permet d'éviter de devoir mettre tous nos prefabs et scriptable objects dans le dossier Resources
/// et permet d'accéder aux éléments qu'on cherche par leur nom directement ///
public class Database : SingletonBehaviour { #if UNITY_EDITOR [Header("Editor section")] [SerializeField] private List _folders; public List Folders => _folders; #endif public const string TYPE = nameof(TYPE); public void FetchDatabase() { foreach (var folder in Folders) { var path = AssetDatabase.GetAssetPath(folder); foreach (var file in GetAllPaths(path)) { var scriptableObject = AssetDatabase.LoadAssetAtPath(file); if (scriptableObject && !ScriptableObjects.Contains(scriptableObject)) { ScriptableObjects.Add(scriptableObject); } var prefab = AssetDatabase.LoadAssetAtPath(file); if (prefab && !Prefabs.Contains(prefab)) { Prefabs.Add(prefab); } } } } public static void FetchDatabaseStatic() { Instance.FetchDatabase(); } private static string[] GetAllPaths(string target) { var files = Directory.GetFiles(target).ToList(); foreach (var dir in Directory.GetDirectories(target)) { files.AddRange(GetAllPaths(dir)); } return files.ToArray(); } [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(); } #if UNITY_EDITOR #endif }