130 lines
4.2 KiB
C#
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
|
|
}
|
|
}
|