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
}