Files

130 lines
4.2 KiB
C#

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<AssetEntry> _sceneReferences = new();
[ReorderableList]
[SerializeField]
private List<AssetEntry> _levelReferences = new();
[ReorderableList]
[SerializeField]
private List<AssetEntry> _itemReferences = new();
[ReorderableList]
[SerializeField]
private List<AssetEntry> _uiReferences = new();
private Dictionary<string, AssetReference> _assetDictionary;
public IReadOnlyList<AssetEntry> SceneReferences => _sceneReferences;
public IReadOnlyList<AssetEntry> LevelReferences => _levelReferences;
public IReadOnlyList<AssetEntry> ItemReferences => _itemReferences;
public IReadOnlyList<AssetEntry> UIReferences => _uiReferences;
public void EnsureInitialized()
{
if (_assetDictionary != null)
return;
RebuildLookup();
}
public void RebuildLookup()
{
_assetDictionary = new Dictionary<string, AssetReference>();
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<string> GetAllKeys()
{
EnsureInitialized();
return _assetDictionary.Keys;
}
#if UNITY_EDITOR
public void SetDiscoveredEntries(
List<AssetEntry> sceneEntries,
List<AssetEntry> levelEntries,
List<AssetEntry> itemEntries,
List<AssetEntry> uiEntries)
{
_sceneReferences = sceneEntries ?? new List<AssetEntry>();
_levelReferences = levelEntries ?? new List<AssetEntry>();
_itemReferences = itemEntries ?? new List<AssetEntry>();
_uiReferences = uiEntries ?? new List<AssetEntry>();
RebuildLookup();
}
#endif
}
}