using System.Collections.Generic; using BriarQueen.Data.Assets; using NaughtyAttributes; using UnityEngine; using UnityEngine.AddressableAssets; namespace BriarQueen.Framework.Registries { [CreateAssetMenu(menuName = "Briar Queen/Registries/Asset Registry", fileName = "New Asset Registry")] public class AssetRegistry : ScriptableObject { [Header("Asset References (Generic Addressables)")] [ReorderableList] [SerializeField] private List _sceneReferences = new(); [ReorderableList] [SerializeField] private List _levelReferences = new(); [ReorderableList] [SerializeField] private List _itemReferences = new(); [ReorderableList] [SerializeField] private List _uiReferences = new(); private Dictionary _assetDictionary; public IReadOnlyList SceneReferences => _sceneReferences; public IReadOnlyList LevelReferences => _levelReferences; public IReadOnlyList ItemReferences => _itemReferences; public IReadOnlyList UIReferences => _uiReferences; public void EnsureInitialized() { if (_assetDictionary != null) return; RebuildLookup(); } public void RebuildLookup() { _assetDictionary = new Dictionary(); RegistryLookupBuilder.AddEntries( _assetDictionary, _sceneReferences, this, nameof(AssetRegistry), "Scenes", "AssetKey", entry => entry.AssetKey, entry => entry.Asset, entry => RegistryLookupBuilder.HasNonEmptyKey(entry.AssetKey), entry => entry.Asset != null, "AssetReference is null"); RegistryLookupBuilder.AddEntries( _assetDictionary, _levelReferences, this, nameof(AssetRegistry), "Levels", "AssetKey", entry => entry.AssetKey, entry => entry.Asset, entry => RegistryLookupBuilder.HasNonEmptyKey(entry.AssetKey), entry => entry.Asset != null, "AssetReference is null"); RegistryLookupBuilder.AddEntries( _assetDictionary, _itemReferences, this, nameof(AssetRegistry), "Items", "AssetKey", entry => entry.AssetKey, entry => entry.Asset, entry => RegistryLookupBuilder.HasNonEmptyKey(entry.AssetKey), entry => entry.Asset != null, "AssetReference is null"); RegistryLookupBuilder.AddEntries( _assetDictionary, _uiReferences, this, nameof(AssetRegistry), "UI", "AssetKey", entry => entry.AssetKey, entry => entry.Asset, entry => RegistryLookupBuilder.HasNonEmptyKey(entry.AssetKey), entry => entry.Asset != null, "AssetReference is null"); } public bool TryGetReference(string key, out AssetReference reference) { EnsureInitialized(); return _assetDictionary.TryGetValue(key, out reference); } public IEnumerable GetAllKeys() { EnsureInitialized(); return _assetDictionary.Keys; } #if UNITY_EDITOR public void SetDiscoveredEntries( List sceneEntries, List levelEntries, List itemEntries, List uiEntries) { _sceneReferences = sceneEntries ?? new List(); _levelReferences = levelEntries ?? new List(); _itemReferences = itemEntries ?? new List(); _uiReferences = uiEntries ?? new List(); RebuildLookup(); } #endif } }