using System.Collections.Generic; using System.Threading.Tasks; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.AddressableAssets.ResourceLocators; using UnityEngine.ResourceManagement.AsyncOperations; using UnityEngine.ResourceManagement.ResourceLocations; namespace BrewMonster.Scripts { public class AddressableManager : MonoSingleton { private bool _isInitialized = false; private Dictionary> _loadedAssets = new(); protected override void Initialize() { base.Initialize(); _isInitialized = false; Addressables.InitializeAsync().Completed += OnInitializeComplete; } void OnInitializeComplete(AsyncOperationHandle handle) { if (handle.Status == AsyncOperationStatus.Succeeded) { _isInitialized = true; BMLogger.Log($"AddressableManager: Initialized"); } else { // print out the error BMLogger.LogError($"AddressableManager: Failed to initialize: {handle.OperationException?.Message} {handle.OperationException?.StackTrace}"); } } /// /// Load an asset asynchronously. The address should look like this: "models/npcs/npc/魅灵首领/魅灵首领/魅灵首领.prefab" /// /// public async Task LoadPrefabAsync(string assetPath) { if (_loadedAssets.ContainsKey(assetPath)) { return _loadedAssets[assetPath].Result; } try { var handle = Addressables.LoadAssetAsync(assetPath); await handle.Task; _loadedAssets[assetPath] = handle; return handle.Result; } catch (System.Exception e) { BMLogger.LogError(e.StackTrace); return null; } } /// /// When the asset is no longer needed, call this method to unload it. /// /// public void UnloadAsset(string assetPath) { Addressables.Release(assetPath); } } }