using System.Collections.Generic; using UnityEngine.SceneManagement; using YooAsset; namespace ET.Client { [EntitySystemOf(typeof(ResourcesLoaderComponent))] public static partial class ResourcesLoaderComponentSystem { [EntitySystem] private static void Awake(this ResourcesLoaderComponent self) { self.package = YooAssets.GetPackage("DefaultPackage"); } [EntitySystem] private static void Awake(this ResourcesLoaderComponent self, string packageName) { self.package = YooAssets.GetPackage(packageName); } [EntitySystem] private static void Destroy(this ResourcesLoaderComponent self) { foreach (var kv in self.handlers) { switch (kv.Value) { case AssetHandle handle: handle.Release(); break; case AllAssetsHandle handle: handle.Release(); break; case SubAssetsHandle handle: handle.Release(); break; case RawFileHandle handle: handle.Release(); break; case SceneHandle handle: if (!handle.IsMainScene()) { handle.UnloadAsync(); } break; } } } public static async ETTask LoadAssetAsync(this ResourcesLoaderComponent self, string location) where T : UnityEngine.Object { using CoroutineLock coroutineLock = await self.Root().GetComponent().Wait(CoroutineLockType.ResourcesLoader, location.GetHashCode()); HandleBase handler; if (!self.handlers.TryGetValue(location, out handler)) { handler = self.package.LoadAssetAsync(location); await handler.Task; self.handlers.Add(location, handler); } return (T)((AssetHandle)handler).AssetObject; } public static async ETTask> LoadAllAssetsAsync(this ResourcesLoaderComponent self, string location) where T : UnityEngine.Object { using CoroutineLock coroutineLock = await self.Root().GetComponent().Wait(CoroutineLockType.ResourcesLoader, location.GetHashCode()); HandleBase handler; if (!self.handlers.TryGetValue(location, out handler)) { handler = self.package.LoadAllAssetsAsync(location); await handler.Task; self.handlers.Add(location, handler); } Dictionary dictionary = new Dictionary(); foreach (UnityEngine.Object assetObj in ((AllAssetsHandle)handler).AllAssetObjects) { T t = assetObj as T; dictionary.Add(t.name, t); } return dictionary; } public static async ETTask LoadSceneAsync(this ResourcesLoaderComponent self, string location, LoadSceneMode loadSceneMode) { using CoroutineLock coroutineLock = await self.Root().GetComponent().Wait(CoroutineLockType.ResourcesLoader, location.GetHashCode()); HandleBase handler; if (self.handlers.TryGetValue(location, out handler)) { return; } handler = self.package.LoadSceneAsync(location); await handler.Task; self.handlers.Add(location, handler); } } }