Files
TEngine/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/ResourceModule.cs

763 lines
32 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.Threading;
using Cysharp.Threading.Tasks;
using UnityEngine;
using YooAsset;
namespace TEngine
{
/// <summary>
/// 资源模块。
/// </summary>
[DisallowMultipleComponent]
public class ResourceModule : Module
{
#region Propreties
/// <summary>
/// 获取当前资源适用的游戏版本号。
/// </summary>
public string ApplicableGameVersion => m_ResourceManager?.ApplicableGameVersion ?? "Unknown";
/// <summary>
/// 获取当前内部资源版本号。
/// </summary>
public int InternalResourceVersion => m_ResourceManager?.InternalResourceVersion ?? 0;
/// <summary>
/// 默认资源加载优先级。
/// </summary>
public const int DefaultPriority = 0;
/// <summary>
/// 当前最新的包裹版本。
/// </summary>
public string PackageVersion { set; get; }
/// <summary>
/// 资源包名称。
/// </summary>
public string packageName = "DefaultPackage";
/// <summary>
/// 资源系统运行模式。
/// </summary>
[SerializeField] private EPlayMode playMode = EPlayMode.EditorSimulateMode;
/// <summary>
/// 资源系统运行模式。
/// <remarks>编辑器内优先使用。</remarks>
/// </summary>
public EPlayMode PlayMode
{
get
{
#if UNITY_EDITOR
//编辑器模式使用。
return (EPlayMode)UnityEditor.EditorPrefs.GetInt("EditorResourceMode");
#else
if (playMode == EPlayMode.EditorSimulateMode)
{
playMode = EPlayMode.OfflinePlayMode;
}
//运行时使用。
return playMode;
#endif
}
set
{
#if UNITY_EDITOR
playMode = value;
#endif
}
}
/// <summary>
/// 下载文件校验等级。
/// </summary>
public EVerifyLevel verifyLevel = EVerifyLevel.Middle;
/// <summary>
/// 资源下载器,用于下载当前资源版本所有的资源包文件。
/// </summary>
public ResourceDownloaderOperation Downloader { get; set; }
[SerializeField] private ReadWritePathType readWritePathType = ReadWritePathType.Unspecified;
[SerializeField] private float minUnloadUnusedAssetsInterval = 60f;
[SerializeField] private float maxUnloadUnusedAssetsInterval = 300f;
/// <summary>
/// 设置异步系统参数,每帧执行消耗的最大时间切片(单位:毫秒)
/// </summary>
public long milliseconds = 30;
public int downloadingMaxNum = 3;
public int failedTryAgain = 3;
/// <summary>
/// 资源缓存表容量。
/// </summary>
public int adaptiveReplacementCacheCapacity = 32;
private IResourceManager m_ResourceManager;
private AsyncOperation m_AsyncOperation = null;
private bool m_ForceUnloadUnusedAssets = false;
private bool m_PreorderUnloadUnusedAssets = false;
private bool m_PerformGCCollect = false;
private float m_LastUnloadUnusedAssetsOperationElapseSeconds = 0f;
private bool m_InitPackageByProcedure = true;
/// <summary>
/// 全局取消操作Token。
/// </summary>
public CancellationToken DefaultToken { private set; get; }
/// <summary>
/// 获取或设置同时最大下载数目。
/// </summary>
public int DownloadingMaxNum
{
get => downloadingMaxNum;
set => downloadingMaxNum = value;
}
/// <summary>
/// 失败尝试数目。
/// </summary>
public int FailedTryAgain
{
get => failedTryAgain;
set => failedTryAgain = value;
}
/// <summary>
/// 获取资源读写路径类型。
/// </summary>
public ReadWritePathType ReadWritePathType => readWritePathType;
/// <summary>
/// 获取或设置无用资源释放的最小间隔时间,以秒为单位。
/// </summary>
public float MinUnloadUnusedAssetsInterval
{
get => minUnloadUnusedAssetsInterval;
set => minUnloadUnusedAssetsInterval = value;
}
/// <summary>
/// 获取或设置无用资源释放的最大间隔时间,以秒为单位。
/// </summary>
public float MaxUnloadUnusedAssetsInterval
{
get => maxUnloadUnusedAssetsInterval;
set => maxUnloadUnusedAssetsInterval = value;
}
/// <summary>
/// 获取无用资源释放的等待时长,以秒为单位。
/// </summary>
public float LastUnloadUnusedAssetsOperationElapseSeconds => m_LastUnloadUnusedAssetsOperationElapseSeconds;
/// <summary>
/// 获取资源只读路径。
/// </summary>
public string ReadOnlyPath => m_ResourceManager.ReadOnlyPath;
/// <summary>
/// 获取资源读写路径。
/// </summary>
public string ReadWritePath => m_ResourceManager.ReadWritePath;
#endregion
private void Start()
{
RootModule baseComponent = ModuleSystem.GetModule<RootModule>();
if (baseComponent == null)
{
Log.Fatal("Base component is invalid.");
return;
}
m_ResourceManager = ModuleImpSystem.GetModule<IResourceManager>();
if (m_ResourceManager == null)
{
Log.Fatal("YooAssetsManager component is invalid.");
return;
}
DefaultToken = gameObject.GetCancellationTokenOnDestroy();
if (playMode == EPlayMode.EditorSimulateMode)
{
Log.Info("During this run, TEngine will use editor resource files, which you should validate first.");
#if !UNITY_EDITOR
playMode = EPlayMode.OfflinePlayMode;
#endif
}
m_ResourceManager.SetReadOnlyPath(Application.streamingAssetsPath);
if (readWritePathType == ReadWritePathType.TemporaryCache)
{
m_ResourceManager.SetReadWritePath(Application.temporaryCachePath);
}
else
{
if (readWritePathType == ReadWritePathType.Unspecified)
{
readWritePathType = ReadWritePathType.PersistentData;
}
m_ResourceManager.SetReadWritePath(Application.persistentDataPath);
}
m_ResourceManager.PackageName = packageName;
m_ResourceManager.PlayMode = playMode;
m_ResourceManager.VerifyLevel = verifyLevel;
m_ResourceManager.Milliseconds = milliseconds;
m_ResourceManager.ARCTableCapacity = adaptiveReplacementCacheCapacity;
m_ResourceManager.Initialize();
Log.Info($"ResourceModule Run Mode{playMode}");
if (playMode == EPlayMode.EditorSimulateMode && !m_InitPackageByProcedure)
{
m_ResourceManager.InitPackage();
}
}
/// <summary>
/// 初始化操作。
/// </summary>
/// <returns></returns>
public InitializationOperation InitPackage()
{
return m_ResourceManager.InitPackage();
}
/// <summary>
/// 获取当前资源包版本。
/// </summary>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
/// <returns>资源包版本。</returns>
public string GetPackageVersion(string packageName = "")
{
var package = string.IsNullOrEmpty(packageName)
? YooAssets.GetPackage(this.packageName)
: YooAssets.GetPackage(packageName);
if (package == null)
{
return string.Empty;
}
return package.GetPackageVersion();
}
/// <summary>
/// 异步更新最新包的版本。
/// </summary>
/// <param name="appendTimeTicks">请求URL是否需要带时间戳。</param>
/// <param name="timeout">超时时间。</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
/// <returns>请求远端包裹的最新版本操作句柄。</returns>
public UpdatePackageVersionOperation UpdatePackageVersionAsync(bool appendTimeTicks = false, int timeout = 60,
string packageName = "")
{
var package = string.IsNullOrEmpty(packageName)
? YooAssets.GetPackage(this.packageName)
: YooAssets.GetPackage(packageName);
return package.UpdatePackageVersionAsync(appendTimeTicks, timeout);
}
/// <summary>
/// 向网络端请求并更新清单
/// </summary>
/// <param name="packageVersion">更新的包裹版本</param>
/// <param name="autoSaveVersion">更新成功后自动保存版本号,作为下次初始化的版本。</param>
/// <param name="timeout">超时时间默认值60秒</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
public UpdatePackageManifestOperation UpdatePackageManifestAsync(string packageVersion,
bool autoSaveVersion = true, int timeout = 60, string packageName = "")
{
var package = string.IsNullOrEmpty(packageName)
? YooAssets.GetPackage(this.packageName)
: YooAssets.GetPackage(packageName);
return package.UpdatePackageManifestAsync(packageVersion, autoSaveVersion, timeout);
}
/// <summary>
/// 创建资源下载器,用于下载当前资源版本所有的资源包文件。
/// </summary>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
public ResourceDownloaderOperation CreateResourceDownloader(string packageName = "")
{
if (string.IsNullOrEmpty(packageName))
{
var package = YooAssets.GetPackage(this.packageName);
Downloader = package.CreateResourceDownloader(downloadingMaxNum, failedTryAgain);
return Downloader;
}
else
{
var package = YooAssets.GetPackage(packageName);
Downloader = package.CreateResourceDownloader(downloadingMaxNum, failedTryAgain);
return Downloader;
}
}
/// <summary>
/// 清理包裹未使用的缓存文件。
/// </summary>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
public ClearUnusedCacheFilesOperation ClearUnusedCacheFilesAsync(string packageName = "")
{
var package = string.IsNullOrEmpty(packageName)
? YooAssets.GetPackage(this.packageName)
: YooAssets.GetPackage(packageName);
return package.ClearUnusedCacheFilesAsync();
}
/// <summary>
/// 清理沙盒路径。
/// </summary>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
public void ClearSandbox(string packageName = "")
{
var package = string.IsNullOrEmpty(packageName)
? YooAssets.GetPackage(this.packageName)
: YooAssets.GetPackage(packageName);
package.ClearPackageSandbox();
}
/// <summary>
/// 卸载资源。
/// </summary>
/// <param name="asset">要卸载的资源。</param>
public void UnloadAsset(object asset)
{
m_ResourceManager.UnloadAsset(asset);
}
/// <summary>
/// 预订执行释放未被使用的资源。
/// </summary>
/// <param name="performGCCollect">是否使用垃圾回收。</param>
public void UnloadUnusedAssets(bool performGCCollect)
{
m_PreorderUnloadUnusedAssets = true;
m_PerformGCCollect = performGCCollect;
}
/// <summary>
/// 强制执行释放未被使用的资源。
/// </summary>
/// <param name="performGCCollect">是否使用垃圾回收。</param>
public void ForceUnloadUnusedAssets(bool performGCCollect)
{
m_ForceUnloadUnusedAssets = true;
if (performGCCollect)
{
m_PerformGCCollect = true;
}
}
/// <summary>
/// 资源模块外部轮询(释放无用资源)。
/// </summary>
private void Update()
{
m_LastUnloadUnusedAssetsOperationElapseSeconds += GameTime.unscaledDeltaTime;
if (m_AsyncOperation == null &&
(m_ForceUnloadUnusedAssets ||
m_LastUnloadUnusedAssetsOperationElapseSeconds >= maxUnloadUnusedAssetsInterval ||
m_PreorderUnloadUnusedAssets &&
m_LastUnloadUnusedAssetsOperationElapseSeconds >= minUnloadUnusedAssetsInterval))
{
Log.Info("Unload unused assets...");
m_ForceUnloadUnusedAssets = false;
m_PreorderUnloadUnusedAssets = false;
m_LastUnloadUnusedAssetsOperationElapseSeconds = 0f;
m_AsyncOperation = Resources.UnloadUnusedAssets();
}
if (m_AsyncOperation is { isDone: true })
{
m_ResourceManager.UnloadUnusedAssets();
m_AsyncOperation = null;
if (m_PerformGCCollect)
{
Log.Info("GC.Collect...");
m_PerformGCCollect = false;
GC.Collect();
}
}
}
/// <summary>
/// 检查资源是否存在。
/// </summary>
/// <param name="location">要检查资源的名称。</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
/// <returns>检查资源是否存在的结果。</returns>
public HasAssetResult HasAsset(string location, string packageName = "")
{
return m_ResourceManager.HasAsset(location, packageName: packageName);
}
/// <summary>
/// 设置默认资源包。
/// </summary>
/// <param name="package">资源包。</param>
public void SetDefaultPackage(ResourcePackage package)
{
m_ResourceManager.SetDefaultPackage(package);
}
/// <summary>
/// 是否需要从远端更新下载。
/// </summary>
/// <param name="location">资源的定位地址。</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
/// <returns></returns>
public bool IsNeedDownloadFromRemote(string location, string packageName = "")
{
return m_ResourceManager.IsNeedDownloadFromRemote(location, packageName: packageName);
}
/// <summary>
/// 是否需要从远端更新下载。
/// </summary>
/// <param name="assetInfo">资源信息。</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
/// <returns></returns>
public bool IsNeedDownloadFromRemote(AssetInfo assetInfo, string packageName = "")
{
return m_ResourceManager.IsNeedDownloadFromRemote(assetInfo, packageName: packageName);
}
/// <summary>
/// 获取资源信息列表。
/// </summary>
/// <param name="resTag">资源标签。</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
/// <returns>资源信息列表。</returns>
public AssetInfo[] GetAssetInfos(string resTag, string packageName = "")
{
return m_ResourceManager.GetAssetInfos(resTag, packageName: packageName);
}
/// <summary>
/// 获取资源信息列表。
/// </summary>
/// <param name="tags">资源标签列表。</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
/// <returns>资源信息列表。</returns>
public AssetInfo[] GetAssetInfos(string[] tags, string packageName = "")
{
return m_ResourceManager.GetAssetInfos(tags, packageName: packageName);
}
/// <summary>
/// 获取资源信息。
/// </summary>
/// <param name="location">资源的定位地址。</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
/// <returns>资源信息。</returns>
public AssetInfo GetAssetInfo(string location, string packageName = "")
{
return m_ResourceManager.GetAssetInfo(location, packageName: packageName);
}
/// <summary>
/// 检查资源定位地址是否有效。
/// </summary>
/// <param name="location">资源的定位地址</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
public bool CheckLocationValid(string location, string packageName = "")
{
return m_ResourceManager.CheckLocationValid(location, packageName: packageName);
}
/// <summary>
/// 同步加载资源。
/// </summary>
/// <param name="location">资源的定位地址。</param>
/// <param name="needInstance">是否需要实例化。</param>
/// <param name="needCache">是否需要缓存。</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
/// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>资源实例。</returns>
public T LoadAsset<T>(string location, bool needInstance = true, bool needCache = false,
string packageName = "") where T : UnityEngine.Object
{
return m_ResourceManager.LoadAsset<T>(location, needInstance, needCache, packageName: packageName);
}
/// <summary>
/// 同步加载资源。
/// </summary>
/// <param name="location">资源的定位地址。</param>
/// <param name="parent">父节点位置。</param>
/// <param name="needInstance">是否需要实例化。</param>
/// <param name="needCache">是否需要缓存。</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
/// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>资源实例。</returns>
public T LoadAsset<T>(string location, Transform parent, bool needInstance = true, bool needCache = false,
string packageName = "") where T : UnityEngine.Object
{
return m_ResourceManager.LoadAsset<T>(location, parent, needInstance, needCache, packageName: packageName);
}
/// <summary>
/// 同步加载资源。
/// </summary>
/// <param name="handle">资源操作句柄。</param>
/// <param name="location">资源的定位地址。</param>
/// <param name="needCache">是否需要缓存。</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
/// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>资源实例。</returns>
public T LoadAsset<T>(string location, out AssetOperationHandle handle, bool needCache = false,
string packageName = "") where T : UnityEngine.Object
{
return m_ResourceManager.LoadAsset<T>(location, out handle, needCache, packageName: packageName);
}
/// <summary>
/// 同步加载资源。
/// </summary>
/// <param name="location">资源的定位地址。</param>
/// <param name="handle">资源操作句柄。</param>
/// <param name="parent">父节点位置。</param>
/// <param name="needCache">是否需要缓存。</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
/// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>资源实例。</returns>
public T LoadAsset<T>(string location, Transform parent, out AssetOperationHandle handle,
bool needCache = false, string packageName = "") where T : UnityEngine.Object
{
return m_ResourceManager.LoadAsset<T>(location, parent, out handle, needCache, packageName: packageName);
}
/// <summary>
/// 异步加载资源。
/// </summary>
/// <param name="location">资源的定位地址。</param>
/// <param name="callback">回调函数。</param>
/// <param name="needCache">是否需要缓存。</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
/// <typeparam name="T">要加载资源的类型。</typeparam>
public void LoadAssetAsync<T>(string location, Action<AssetOperationHandle> callback = null,
bool needCache = false, string packageName = "") where T : UnityEngine.Object
{
AssetOperationHandle handle =
m_ResourceManager.LoadAssetAsyncHandle<T>(location, needCache, packageName: packageName);
handle.Completed += callback;
}
/// <summary>
/// 同步加载资源并获取句柄。
/// </summary>
/// <param name="location">资源的定位地址。</param>
/// <param name="needCache">是否需要缓存。</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
/// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>同步加载资源句柄。</returns>
public AssetOperationHandle LoadAssetGetOperation<T>(string location, bool needCache = false,
string packageName = "") where T : UnityEngine.Object
{
return m_ResourceManager.LoadAssetGetOperation<T>(location, needCache, packageName: packageName);
}
/// <summary>
/// 异步加载资源并获取句柄。
/// </summary>
/// <param name="location">资源的定位地址。</param>
/// <param name="needCache">是否需要缓存。</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
/// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>异步加载资源句柄。</returns>
public AssetOperationHandle LoadAssetAsyncHandle<T>(string location, bool needCache = false,
string packageName = "") where T : UnityEngine.Object
{
return m_ResourceManager.LoadAssetAsyncHandle<T>(location, needCache, packageName: packageName);
}
/// <summary>
/// 同步加载子资源对象
/// </summary>
/// <typeparam name="TObject">资源类型</typeparam>
/// <param name="location">资源的定位地址</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
public SubAssetsOperationHandle LoadSubAssetsSync<TObject>(string location, string packageName = "")
where TObject : UnityEngine.Object
{
return m_ResourceManager.LoadSubAssetsSync<TObject>(location: location, packageName: packageName);
}
/// <summary>
/// 异步加载子资源对象
/// </summary>
/// <typeparam name="TObject">资源类型</typeparam>
/// <param name="location">资源的定位地址</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
public SubAssetsOperationHandle LoadSubAssetsAsync<TObject>(string location, string packageName = "")
where TObject : UnityEngine.Object
{
return m_ResourceManager.LoadSubAssetsAsync<TObject>(location: location, packageName: packageName);
}
/// <summary>
/// 同步加载子资源对象
/// </summary>
/// <param name="location">资源的定位地址</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
public SubAssetsOperationHandle LoadSubAssetsSync(string location, string packageName = "")
{
var assetInfo = GetAssetInfo(location, packageName: packageName);
if (assetInfo == null)
{
Log.Fatal($"AssetsInfo is null");
return null;
}
return m_ResourceManager.LoadSubAssetsSync(assetInfo, packageName: packageName);
}
/// <summary>
/// 通过Tag加载资源对象集合。
/// </summary>
/// <param name="assetTag">资源标识。</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
/// <typeparam name="T">资源类型。</typeparam>
/// <returns>资源对象集合。</returns>
public async UniTask<List<T>> LoadAssetsByTagAsync<T>(string assetTag, string packageName = "")
where T : UnityEngine.Object
{
return await m_ResourceManager.LoadAssetsByTagAsync<T>(assetTag, packageName: packageName);
}
/// <summary>
/// 异步加载资源。
/// </summary>
/// <param name="location">资源的定位地址。</param>
/// <param name="cancellationToken">取消操作Token。</param>
/// <param name="needInstance">是否需要实例化。</param>
/// <param name="needCache">是否需要缓存。</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
/// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>异步资源实例。</returns>
public async UniTask<T> LoadAssetAsync<T>(string location, CancellationToken cancellationToken = default,
bool needInstance = true, bool needCache = false, string packageName = "") where T : UnityEngine.Object
{
return await m_ResourceManager.LoadAssetAsync<T>(location, cancellationToken, needInstance, needCache,
packageName: packageName);
}
/// <summary>
/// 异步加载游戏物体。
/// </summary>
/// <param name="location">要加载的游戏物体名称。</param>
/// <param name="cancellationToken">取消操作Token。</param>
/// <param name="needCache">是否需要缓存。</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
/// <returns>异步游戏物体实例。</returns>
public async UniTask<GameObject> LoadGameObjectAsync(string location,
CancellationToken cancellationToken = default, bool needCache = false, string packageName = "")
{
return await m_ResourceManager.LoadGameObjectAsync(location, cancellationToken, needCache,
packageName: packageName);
}
/// <summary>
/// 异步加载游戏物体。
/// </summary>
/// <param name="location">资源定位地址。</param>
/// <param name="parent">父节点位置。</param>
/// <param name="cancellationToken">取消操作Token。</param>
/// <param name="needCache">是否需要缓存。</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
/// <returns>异步游戏物体实例。</returns>
public async UniTask<GameObject> LoadGameObjectAsync(string location, Transform parent,
CancellationToken cancellationToken = default, bool needCache = false, string packageName = "")
{
return await m_ResourceManager.LoadGameObjectAsync(location, parent, cancellationToken, needCache,
packageName: packageName);
}
/// <summary>
/// 异步加载原生文件。
/// </summary>
/// <param name="location">资源定位地址。</param>
/// <param name="cancellationToken">取消操作Token。</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
/// <returns>原生文件资源实例。</returns>
public async UniTask<RawFileOperationHandle> LoadRawAssetAsync(string location,
CancellationToken cancellationToken = default, string packageName = "")
{
return await m_ResourceManager.LoadRawAssetAsync(location, cancellationToken, packageName: packageName);
}
/// <summary>
/// 异步加载子文件。
/// </summary>
/// <param name="location">资源定位地址。</param>
/// <param name="assetName">子资源名称。</param>
/// <param name="cancellationToken">取消操作Token。</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
/// <typeparam name="T">资源实例类型。</typeparam>
/// <returns>原生文件资源实例。</returns>
public async UniTask<T> LoadSubAssetAsync<T>(string location, string assetName,
CancellationToken cancellationToken = default, string packageName = "") where T : UnityEngine.Object
{
return await m_ResourceManager.LoadSubAssetAsync<T>(location, assetName, cancellationToken,
packageName: packageName);
}
/// <summary>
/// 异步加载所有子文件。
/// </summary>
/// <param name="location">资源定位地址。</param>
/// <param name="cancellationToken">取消操作Token。</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
/// <typeparam name="T">资源实例类型。</typeparam>
/// <returns>原生文件资源实例。</returns>
public async UniTask<T[]> LoadAllSubAssetAsync<T>(string location,
CancellationToken cancellationToken = default, string packageName = "") where T : UnityEngine.Object
{
return await m_ResourceManager.LoadAllSubAssetAsync<T>(location, cancellationToken,
packageName: packageName);
}
#region
/// <summary>
/// 放入预加载对象。
/// </summary>
/// <param name="location">资源定位地址。</param>
/// <param name="assetObject">预加载对象。</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
public void PushPreLoadAsset(string location, UnityEngine.Object assetObject, string packageName = "")
{
m_ResourceManager.PushPreLoadAsset(location, assetObject, packageName: packageName);
}
/// <summary>
/// 获取预加载的实例对象。
/// </summary>
/// <param name="location">资源定位地址。</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
/// <typeparam name="T">资源实例类型。</typeparam>
/// <returns>预加载对象。</returns>
public T GetPreLoadAsset<T>(string location, string packageName = "") where T : UnityEngine.Object
{
return m_ResourceManager.GetPreLoadAsset<T>(location, packageName: packageName);
}
#endregion
}
}