AlicizaX/Client/Packages/com.alicizax.unity.resource/Runtime/Resource/ResourceComponent.cs
2025-03-04 18:40:14 +08:00

450 lines
18 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.Threading;
using AlicizaX.Runtime;
using Cysharp.Threading.Tasks;
using UnityEngine;
using UnityEngine.SceneManagement;
using YooAsset;
namespace AlicizaX.Resource.Runtime
{
[DisallowMultipleComponent]
[AddComponentMenu("Game Framework/ResourceComponent")]
[UnityEngine.Scripting.Preserve]
public class ResourceComponent : GameFrameworkComponent
{
#region Propreties
[Tooltip("当目标平台为Web平台时将会强制设置为" + nameof(EPlayMode.WebPlayMode))]
private EPlayMode m_GamePlayMode;
[SerializeField] private long m_Milliseconds = 30;
[SerializeField] private string m_defaultPackageName = "DefaultPackage";
[SerializeField] private float m_AssetAutoReleaseInterval = 60;
[SerializeField] private int m_AssetCapacity = 64;
[SerializeField] private float m_AssetExpireTime = 60;
[SerializeField] private int m_AssetPriority = 0;
[SerializeField] private string m_DecryptionServices;
/// <summary>
/// 资源的运行模式
/// </summary>
public EPlayMode GamePlayMode
{
get { return m_GamePlayMode; }
}
public const int DefaultPriority = 0;
private IResourceManager m_ResourceManager;
/// <summary>
/// 当前最新的包裹版本。
/// </summary>
public string PackageVersion { set; get; }
#endregion
private void OnDestroy()
{
m_ResourceManager = null;
}
protected override void Awake()
{
ImplementationComponentType = Utility.Assembly.GetType(componentType);
InterfaceComponentType = typeof(IResourceManager);
base.Awake();
m_ResourceManager = SysModuleCenter.GetModule<IResourceManager>();
}
public static string PrefsKey = Application.dataPath.GetHashCode() + "GamePlayMode";
protected void Start()
{
#if UNITY_EDITOR
m_GamePlayMode = (EPlayMode)UnityEditor.EditorPrefs.GetInt(PrefsKey, 0);
#else
m_GamePlayMode = (EPlayMode)FrameworkSettingsUtils.FrameworkPublishSettings.ResMode;
#endif
m_ResourceManager.DefaultPackageName = m_defaultPackageName;
m_ResourceManager.PlayMode = m_GamePlayMode;
m_ResourceManager.VerifyLevel = EFileVerifyLevel.Middle;
m_ResourceManager.Milliseconds = m_Milliseconds;
m_ResourceManager.InstanceRoot = transform;
m_ResourceManager.Initialize();
m_ResourceManager.AssetAutoReleaseInterval = m_AssetAutoReleaseInterval;
m_ResourceManager.AssetCapacity = m_AssetCapacity;
m_ResourceManager.AssetExpireTime = m_AssetExpireTime;
m_ResourceManager.AssetPriority = m_AssetPriority;
Log.Info($"ResourceComponent Run Mode{m_GamePlayMode}");
}
/// <summary>
/// 初始化操作。
/// </summary>
/// <returns></returns>
public async UniTask<bool> InitPackageAsync(string packageName = "", string host = "", string fallbackHostServer = "", bool isDefaultPackage = true)
{
if (m_ResourceManager == null)
{
Log.Error("Resource component is invalid.");
return false;
}
if (string.IsNullOrEmpty(packageName))
{
packageName = m_defaultPackageName;
}
return await m_ResourceManager.InitPackageAsync(packageName, host, fallbackHostServer, m_DecryptionServices, isDefaultPackage);
}
#region
/// <summary>
/// 获取当前资源包版本。
/// </summary>
/// <param name="customPackageName">指定资源包的名称。不传使用默认资源包</param>
/// <returns>资源包版本。</returns>
public string GetPackageVersion(string customPackageName = "")
{
var package = string.IsNullOrEmpty(customPackageName)
? YooAssets.GetPackage(m_defaultPackageName)
: YooAssets.GetPackage(customPackageName);
if (package == null)
{
return string.Empty;
}
return package.GetPackageVersion();
}
/// <summary>
/// 异步更新最新包的版本。
/// </summary>
/// <param name="appendTimeTicks">请求URL是否需要带时间戳。</param>
/// <param name="timeout">超时时间。</param>
/// <param name="customPackageName">指定资源包的名称。不传使用默认资源包</param>
/// <returns>请求远端包裹的最新版本操作句柄。</returns>
public RequestPackageVersionOperation RequestPackageVersionAsync(bool appendTimeTicks = false, int timeout = 60,
string customPackageName = "")
{
var package = string.IsNullOrEmpty(customPackageName)
? YooAssets.GetPackage(m_defaultPackageName)
: YooAssets.GetPackage(customPackageName);
return package.RequestPackageVersionAsync(appendTimeTicks, timeout);
}
/// <summary>
/// 向网络端请求并更新清单
/// </summary>
/// <param name="packageVersion">更新的包裹版本</param>
/// <param name="autoSaveVersion">更新成功后自动保存版本号,作为下次初始化的版本。</param>
/// <param name="timeout">超时时间默认值60秒</param>
/// <param name="customPackageName">指定资源包的名称。不传使用默认资源包</param>
public UpdatePackageManifestOperation UpdatePackageManifestAsync(string packageVersion, int timeout = 60, string customPackageName = "")
{
var package = string.IsNullOrEmpty(customPackageName)
? YooAssets.GetPackage(m_defaultPackageName)
: YooAssets.GetPackage(customPackageName);
return package.UpdatePackageManifestAsync(packageVersion, timeout);
}
/// <summary>
/// 清理包裹未使用的缓存文件。
/// </summary>
/// <param name="customPackageName">指定资源包的名称。不传使用默认资源包</param>
public ClearCacheFilesOperation ClearUnusedCacheFilesAsync(EFileClearMode clearMode, string customPackageName = "")
{
var package = string.IsNullOrEmpty(customPackageName)
? YooAssets.GetPackage(m_defaultPackageName)
: YooAssets.GetPackage(customPackageName);
return package.ClearCacheFilesAsync(clearMode);
}
#endregion
#region
/// <summary>
/// 异步加载场景
/// </summary>
/// <param name="path">资源路径</param>
/// <param name="sceneMode">场景模式</param>
/// <param name="activateOnLoad">是否加载完成自动激活</param>
/// <returns></returns>
public UniTask<SceneHandle> LoadSceneAsync(string path, LoadSceneMode sceneMode, bool activateOnLoad = true)
{
return m_ResourceManager.LoadSceneAsync(path, sceneMode, activateOnLoad);
}
/// <summary>
/// 异步加载场景
/// </summary>
/// <param name="assetInfo">资源路径</param>
/// <param name="sceneMode">场景模式</param>
/// <param name="activateOnLoad">是否加载完成自动激活</param>
/// <returns></returns>
public UniTask<SceneHandle> LoadSceneAsync(AssetInfo assetInfo, LoadSceneMode sceneMode, bool activateOnLoad = true)
{
return m_ResourceManager.LoadSceneAsync(assetInfo, sceneMode, activateOnLoad);
}
#endregion
#region
/// <summary>
/// 检查资源是否存在。
/// </summary>
/// <param name="location">要检查资源的名称。</param>
/// <param name="customPackageName">指定资源包的名称。不传使用默认资源包</param>
/// <returns>检查资源是否存在的结果。</returns>
public HasAssetResult HasAsset(string location, string customPackageName = "")
{
return m_ResourceManager.HasAsset(location, packageName: customPackageName);
}
/// <summary>
/// 检查资源定位地址是否有效。
/// </summary>
/// <param name="location">资源的定位地址</param>
/// <param name="customPackageName">指定资源包的名称。不传使用默认资源包</param>
public bool CheckLocationValid(string location, string customPackageName = "")
{
return m_ResourceManager.CheckLocationValid(location, packageName: customPackageName);
}
/// <summary>
/// 获取资源信息列表。
/// </summary>
/// <param name="resTag">资源标签。</param>
/// <param name="customPackageName">指定资源包的名称。不传使用默认资源包</param>
/// <returns>资源信息列表。</returns>
public AssetInfo[] GetAssetInfos(string resTag, string customPackageName = "")
{
return m_ResourceManager.GetAssetInfos(resTag, packageName: customPackageName);
}
/// <summary>
/// 获取资源信息列表。
/// </summary>
/// <param name="tags">资源标签列表。</param>
/// <param name="customPackageName">指定资源包的名称。不传使用默认资源包</param>
/// <returns>资源信息列表。</returns>
public AssetInfo[] GetAssetInfos(string[] tags, string customPackageName = "")
{
return m_ResourceManager.GetAssetInfos(tags, packageName: customPackageName);
}
/// <summary>
/// 获取资源信息。
/// </summary>
/// <param name="location">资源的定位地址。</param>
/// <param name="customPackageName">指定资源包的名称。不传使用默认资源包</param>
/// <returns>资源信息。</returns>
public AssetInfo GetAssetInfo(string location, string customPackageName = "")
{
return m_ResourceManager.GetAssetInfo(location, packageName: customPackageName);
}
#endregion
#region
/// <summary>
/// 异步加载资源。
/// </summary>
/// <param name="location">资源的定位地址。</param>
/// <param name="assetType">要加载资源的类型。</param>
/// <param name="loadAssetCallbacks">加载资源回调函数集。</param>
/// <param name="userData">用户自定义数据。</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包。</param>
public void LoadAssetAsync(string location, Type assetType, LoadAssetCallbacks loadAssetCallbacks, object userData = null, string packageName = "")
{
LoadAssetAsync(location, assetType, DefaultPriority, loadAssetCallbacks, userData, packageName);
}
/// <summary>
/// 异步加载资源。
/// </summary>
/// <param name="location">资源的定位地址。</param>
/// <param name="assetType">要加载资源的类型。</param>
/// <param name="priority">加载资源的优先级。</param>
/// <param name="loadAssetCallbacks">加载资源回调函数集。</param>
/// <param name="userData">用户自定义数据。</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包。</param>
public void LoadAssetAsync(string location, Type assetType, int priority, LoadAssetCallbacks loadAssetCallbacks, object userData, string packageName = "")
{
if (string.IsNullOrEmpty(location))
{
Log.Error("Asset name is invalid.");
return;
}
m_ResourceManager.LoadAssetAsync(location, assetType, priority, loadAssetCallbacks, userData, packageName);
}
/// <summary>
/// 同步加载资源。
/// </summary>
/// <param name="location">资源的定位地址。</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包。</param>
/// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>资源实例。</returns>
public T LoadAsset<T>(string location, string packageName = "") where T : UnityEngine.Object
{
if (string.IsNullOrEmpty(location))
{
Log.Error("Asset name is invalid.");
return null;
}
return m_ResourceManager.LoadAsset<T>(location, packageName);
}
/// <summary>
/// 同步加载游戏物体并实例化。
/// </summary>
/// <param name="location">资源的定位地址。</param>
/// <param name="parent">资源实例父节点。</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包。</param>
/// <returns>资源实例。</returns>
public GameObject LoadGameObject(string location, Transform parent = null, string packageName = "")
{
if (string.IsNullOrEmpty(location))
{
Log.Error("Asset name is invalid.");
return null;
}
return m_ResourceManager.LoadGameObject(location, parent, packageName);
}
/// <summary>
/// 异步加载资源。
/// </summary>
/// <param name="location">资源的定位地址。</param>
/// <param name="callback">回调函数。</param>
/// <param name="customPackageName">指定资源包的名称。不传使用默认资源包</param>
/// <typeparam name="T">要加载资源的类型。</typeparam>
public void LoadAsset<T>(string location, Action<T> callback, string customPackageName = "") where T : UnityEngine.Object
{
if (string.IsNullOrEmpty(location))
{
Log.Error("Asset name is invalid.");
return;
}
m_ResourceManager.LoadAsset<T>(location, callback, packageName: customPackageName);
}
/// <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> LoadAssetAsync<T>(string location, CancellationToken cancellationToken = default,
string packageName = "") where T : UnityEngine.Object
{
if (string.IsNullOrEmpty(location))
{
Log.Error("Asset name is invalid.");
return null;
}
return await m_ResourceManager.LoadAssetAsync<T>(location, cancellationToken, packageName);
}
/// <summary>
/// 异步加载游戏物体并实例化。
/// </summary>
/// <param name="location">资源定位地址。</param>
/// <param name="parent">资源实例父节点。</param>
/// <param name="cancellationToken">取消操作Token。</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包。</param>
/// <returns>异步游戏物体实例。</returns>
public async UniTask<GameObject> LoadGameObjectAsync(string location, Transform parent = null, CancellationToken cancellationToken = default,
string packageName = "")
{
if (string.IsNullOrEmpty(location))
{
Log.Error("Asset name is invalid.");
return null;
}
return await m_ResourceManager.LoadGameObjectAsync(location, parent, cancellationToken, packageName);
}
public AssetHandle LoadAssetGetOperation<T>(string location,
string packageName = "") where T : UnityEngine.Object
{
return m_ResourceManager.LoadAssetGetOperation<T>(location, packageName);
}
public AssetHandle LoadAssetAsyncHandle<T>(string location, string packageName = "") where T : UnityEngine.Object
{
return m_ResourceManager.LoadAssetAsyncHandle<T>(location, packageName);
}
#endregion
#region
/// <summary>
/// 卸载资源。
/// </summary>
/// <param name="asset">要卸载的资源。</param>
public void UnloadAsset(object asset)
{
if (asset == null)
{
return;
}
m_ResourceManager.UnloadAsset(asset);
}
#endregion
#region
/// <summary>
/// 强制执行释放未被使用的资源。
/// </summary>
/// <param name="performGCCollect">是否使用垃圾回收。</param>
public void ForceUnloadUnusedAssets(bool performGCCollect)
{
m_ResourceManager.UnloadUnusedAssets(performGCCollect);
}
/// <summary>
/// 预订执行释放未被使用的资源。
/// </summary>
/// <param name="performGCCollect">是否使用垃圾回收。</param>
public void UnloadUnusedAssets(bool performGCCollect)
{
m_ResourceManager.ForceUnloadUnusedAssets(performGCCollect);
}
#endregion
}
}