diff --git a/Assets/TEngine/Runtime/GameFramework/Resource/ResourceModule.cs b/Assets/TEngine/Runtime/GameFramework/Resource/ResourceModule.cs index a4d16e22..50e7d255 100644 --- a/Assets/TEngine/Runtime/GameFramework/Resource/ResourceModule.cs +++ b/Assets/TEngine/Runtime/GameFramework/Resource/ResourceModule.cs @@ -1,6 +1,8 @@ using System; +using System.Threading; +using Cysharp.Threading.Tasks; using UnityEngine; -using UnityEngine.Serialization; +using UnityEngine.SceneManagement; using YooAsset; namespace TEngine @@ -12,6 +14,7 @@ namespace TEngine public class ResourceModule : GameFrameworkModuleBase { #region Propreties + /// /// 获取当前资源适用的游戏版本号。 /// @@ -21,7 +24,7 @@ namespace TEngine /// 获取当前内部资源版本号。 /// public int InternalResourceVersion => m_ResourceManager?.InternalResourceVersion ?? 0; - + /// /// 默认资源加载优先级。 /// @@ -52,19 +55,17 @@ namespace TEngine /// public ResourceDownloaderOperation Downloader { get; set; } - [SerializeField] - private ReadWritePathType readWritePathType = ReadWritePathType.Unspecified; + [SerializeField] private ReadWritePathType readWritePathType = ReadWritePathType.Unspecified; - [SerializeField] - private float minUnloadUnusedAssetsInterval = 60f; + [SerializeField] private float minUnloadUnusedAssetsInterval = 60f; - [SerializeField] - private float maxUnloadUnusedAssetsInterval = 300f; + [SerializeField] private float maxUnloadUnusedAssetsInterval = 300f; /// /// 设置异步系统参数,每帧执行消耗的最大时间切片(单位:毫秒) /// public long milliseconds = 30; + public int downloadingMaxNum = 3; public int failedTryAgain = 3; @@ -83,7 +84,7 @@ namespace TEngine get => downloadingMaxNum; set => downloadingMaxNum = value; } - + /// /// 失败尝试数目。 /// @@ -132,7 +133,7 @@ namespace TEngine public string ReadWritePath => m_ResourceManager.ReadWritePath; #endregion - + private void Start() { RootModule baseComponent = GameEntry.GetModule(); @@ -156,7 +157,7 @@ namespace TEngine playMode = EPlayMode.OfflinePlayMode; #endif } - + m_ResourceManager.SetReadOnlyPath(Application.streamingAssetsPath); if (readWritePathType == ReadWritePathType.TemporaryCache) { @@ -171,7 +172,7 @@ namespace TEngine m_ResourceManager.SetReadWritePath(Application.persistentDataPath); } - + m_ResourceManager.PackageName = packageName; m_ResourceManager.PlayMode = playMode; m_ResourceManager.VerifyLevel = verifyLevel; @@ -179,7 +180,7 @@ namespace TEngine m_ResourceManager.Initialize(); Log.Info($"AssetsComponent Run Mode:{playMode}"); } - + /// /// 初始化操作。 /// @@ -188,7 +189,7 @@ namespace TEngine { return m_ResourceManager.InitPackage(); } - + /// /// 异步更新最新包的版本。 /// @@ -198,7 +199,7 @@ namespace TEngine public UpdatePackageVersionOperation UpdatePackageVersionAsync(bool appendTimeTicks = true, int timeout = 60) { var package = YooAssets.GetPackage(packageName); - return package.UpdatePackageVersionAsync(appendTimeTicks,timeout); + return package.UpdatePackageVersionAsync(appendTimeTicks, timeout); } /// @@ -210,16 +211,16 @@ namespace TEngine public UpdatePackageManifestOperation UpdatePackageManifestAsync(string packageVersion, int timeout = 60) { var package = YooAssets.GetPackage(packageName); - return package.UpdatePackageManifestAsync(packageVersion,timeout); + return package.UpdatePackageManifestAsync(packageVersion, timeout); } - + /// /// 创建资源下载器,用于下载当前资源版本所有的资源包文件。 /// public ResourceDownloaderOperation CreateResourceDownloader() { var package = YooAssets.GetPackage(packageName); - Downloader = package.CreateResourceDownloader(downloadingMaxNum,failedTryAgain); + Downloader = package.CreateResourceDownloader(downloadingMaxNum, failedTryAgain); return Downloader; } @@ -231,7 +232,7 @@ namespace TEngine var package = YooAssets.GetPackage(packageName); return package.ClearUnusedCacheFilesAsync(); } - + /// /// 清理沙盒路径。 /// @@ -239,7 +240,7 @@ namespace TEngine { YooAssets.ClearSandbox(); } - + /// /// 强制执行释放未被使用的资源。 /// @@ -252,14 +253,15 @@ namespace TEngine m_PerformGCCollect = true; } } - + /// /// 资源模块外部轮询(释放无用资源)。 /// private void Update() { m_LastUnloadUnusedAssetsOperationElapseSeconds += Time.unscaledDeltaTime; - if (m_AsyncOperation == null && (m_ForceUnloadUnusedAssets || m_LastUnloadUnusedAssetsOperationElapseSeconds >= maxUnloadUnusedAssetsInterval || m_PreorderUnloadUnusedAssets && m_LastUnloadUnusedAssetsOperationElapseSeconds >= minUnloadUnusedAssetsInterval)) + if (m_AsyncOperation == null && (m_ForceUnloadUnusedAssets || m_LastUnloadUnusedAssetsOperationElapseSeconds >= maxUnloadUnusedAssetsInterval || + m_PreorderUnloadUnusedAssets && m_LastUnloadUnusedAssetsOperationElapseSeconds >= minUnloadUnusedAssetsInterval)) { Log.Info("Unload unused assets..."); m_ForceUnloadUnusedAssets = false; @@ -267,7 +269,7 @@ namespace TEngine m_LastUnloadUnusedAssetsOperationElapseSeconds = 0f; m_AsyncOperation = Resources.UnloadUnusedAssets(); } - + if (m_AsyncOperation is { isDone: true }) { m_ResourceManager.UnloadUnusedAssets(); @@ -280,5 +282,202 @@ namespace TEngine } } } + + /// + /// 检查资源是否存在。 + /// + /// 要检查资源的名称。 + /// 检查资源是否存在的结果。 + public HasAssetResult HasAsset(string assetName) + { + return m_ResourceManager.HasAsset(assetName); + } + + /// + /// 设置默认资源包。 + /// + /// 资源包。 + public void SetDefaultPackage(ResourcePackage package) + { + m_ResourceManager.SetDefaultPackage(package); + } + + /// + /// 是否需要从远端更新下载。 + /// + /// 资源的定位地址。 + /// + public bool IsNeedDownloadFromRemote(string location) + { + return m_ResourceManager.IsNeedDownloadFromRemote(location); + } + + /// + /// 是否需要从远端更新下载。 + /// + /// 资源信息。 + /// + public bool IsNeedDownloadFromRemote(AssetInfo assetInfo) + { + return m_ResourceManager.IsNeedDownloadFromRemote(assetInfo); + } + + /// + /// 获取资源信息列表。 + /// + /// 资源标签。 + /// 资源信息列表。 + public AssetInfo[] GetAssetInfos(string resTag) + { + return m_ResourceManager.GetAssetInfos(resTag); + } + + /// + /// 获取资源信息列表。 + /// + /// 资源标签列表。 + /// 资源信息列表。 + public AssetInfo[] GetAssetInfos(string[] tags) + { + return m_ResourceManager.GetAssetInfos(tags); + } + + /// + /// 获取资源信息。 + /// + /// 资源的定位地址。 + /// 资源信息。 + public AssetInfo GetAssetInfo(string location) + { + return m_ResourceManager.GetAssetInfo(location); + } + + /// + /// 检查资源定位地址是否有效。 + /// + /// 资源的定位地址 + public bool CheckLocationValid(string location) + { + return m_ResourceManager.CheckLocationValid(location); + } + + /// + /// 同步加载资源。 + /// + /// 要加载资源的名称。 + /// 要加载资源的类型。 + /// 资源实例。 + public T LoadAsset(string assetName) where T : UnityEngine.Object + { + return m_ResourceManager.LoadAsset(assetName); + } + + /// + /// 同步加载资源。 + /// + /// 要加载资源的名称。 + /// 父节点位置。 + /// 要加载资源的类型。 + /// 资源实例。 + public T LoadAsset(string assetName, Transform parent) where T : UnityEngine.Object + { + return m_ResourceManager.LoadAsset(assetName, parent); + } + + /// + /// 同步加载资源。 + /// + /// 资源操作句柄。 + /// 要加载资源的名称。 + /// 要加载资源的类型。 + /// 资源实例。 + public T LoadAsset(string assetName, out AssetOperationHandle handle) where T : UnityEngine.Object + { + return m_ResourceManager.LoadAsset(assetName, out handle); + } + + /// + /// 同步加载资源。 + /// + /// 要加载资源的名称。 + /// 资源操作句柄。 + /// 父节点位置。 + /// 要加载资源的类型。 + /// 资源实例。 + public T LoadAsset(string assetName, Transform parent, out AssetOperationHandle handle) where T : UnityEngine.Object + { + return m_ResourceManager.LoadAsset(assetName, parent, out handle); + } + + /// + /// 异步加载资源。 + /// + /// 要加载资源的名称。 + /// 取消操作Token。 + /// 要加载资源的类型。 + /// 异步资源实例。 + public UniTask LoadAssetAsync(string assetName, CancellationToken cancellationToken) where T : UnityEngine.Object + { + return m_ResourceManager.LoadAssetAsync(assetName, cancellationToken); + } + + /// + /// 异步加载游戏物体。 + /// + /// 要加载的游戏物体名称。 + /// 取消操作Token。 + /// 异步游戏物体实例。 + public UniTask LoadGameObjectAsync(string assetName, CancellationToken cancellationToken) + { + return m_ResourceManager.LoadAssetAsync(assetName, cancellationToken); + } + + /// + /// 同步加载资源并获取句柄。 + /// + /// 要加载资源的名称。 + /// 要加载资源的类型。 + /// 同步加载资源句柄。 + public AssetOperationHandle LoadAssetGetOperation(string assetName) where T : UnityEngine.Object + { + return m_ResourceManager.LoadAssetGetOperation(assetName); + } + + /// + /// 异步加载资源并获取句柄。 + /// + /// 要加载资源的名称。 + /// 要加载资源的类型。 + /// 异步加载资源句柄。 + public AssetOperationHandle LoadAssetAsyncHandle(string assetName) where T : UnityEngine.Object + { + return m_ResourceManager.LoadAssetAsyncHandle(assetName); + } + + /// + /// 异步加载场景。 + /// + /// 场景的定位地址 + /// 场景加载模式 + /// 加载完毕时是否主动激活 + /// 优先级 + /// 异步加载场景句柄。 + public SceneOperationHandle LoadSceneAsync(string location, LoadSceneMode sceneMode = LoadSceneMode.Single, bool activateOnLoad = true, int priority = 100) + { + return m_ResourceManager.LoadSceneAsync(location, sceneMode, activateOnLoad, priority); + } + + /// + /// 异步加载场景 + /// + /// 场景的资源信息 + /// 场景加载模式 + /// 加载完毕时是否主动激活 + /// 优先级 + /// 异步加载场景句柄。 + public SceneOperationHandle LoadSceneAsync(AssetInfo assetInfo, LoadSceneMode sceneMode = LoadSceneMode.Single, bool activateOnLoad = true, int priority = 100) + { + return m_ResourceManager.LoadSceneAsync(assetInfo, sceneMode, activateOnLoad, priority); + } } } \ No newline at end of file