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(); AddEntries(_sceneReferences, "Scenes"); AddEntries(_levelReferences, "Levels"); AddEntries(_itemReferences, "Items"); AddEntries(_uiReferences, "UI"); } private void AddEntries(List entries, string category) { if (entries == null) return; foreach (var entry in entries) { if (entry == null) continue; if (string.IsNullOrWhiteSpace(entry.AssetKey)) { Debug.LogWarning( $"[AssetRegistry] Skipping {category} entry '{entry.name}' because AssetKey is empty.", this); continue; } if (entry.Asset == null) { Debug.LogWarning( $"[AssetRegistry] Skipping {category} entry '{entry.name}' because AssetReference is null.", this); continue; } if (_assetDictionary.ContainsKey(entry.AssetKey)) { Debug.LogError( $"[AssetRegistry] Duplicate AssetKey detected: '{entry.AssetKey}' from entry '{entry.name}'.", this); continue; } _assetDictionary.Add(entry.AssetKey, entry.Asset); } } 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 } }