AlicizaX/Client/Packages/com.alicizax.unity.resource/Runtime/Resource/ResourceComponent.cs

448 lines
18 KiB
C#
Raw Normal View History

2025-01-23 19:06:48 +08:00
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))] [SerializeField]
private EPlayMode m_GamePlayMode;
2025-01-24 16:21:00 +08:00
[SerializeField] private long m_Milliseconds = 30;
2025-01-23 19:06:48 +08:00
[SerializeField] private string m_defaultPackageName = "DefaultPackage";
2025-01-24 16:21:00 +08:00
[SerializeField] private float m_AssetAutoReleaseInterval = 60;
2025-01-23 19:06:48 +08:00
2025-01-24 16:21:00 +08:00
[SerializeField] private int m_AssetCapacity = 64;
2025-01-23 19:06:48 +08:00
2025-01-24 16:21:00 +08:00
[SerializeField] private float m_AssetExpireTime = 60;
2025-01-23 19:06:48 +08:00
2025-01-24 16:21:00 +08:00
[SerializeField] private int m_AssetPriority = 0;
2025-01-23 19:06:48 +08:00
2025-02-06 17:59:35 +08:00
[SerializeField] private string m_DecryptionServices;
2025-01-23 19:06:48 +08:00
/// <summary>
/// 资源的运行模式
/// </summary>
public EPlayMode GamePlayMode
{
get { return m_GamePlayMode; }
set { m_GamePlayMode = value; }
}
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>();
}
2025-02-06 17:59:35 +08:00
public static string PrefsKey = Application.dataPath.GetHashCode() + "GamePlayMode";
2025-01-24 16:21:00 +08:00
2025-01-23 19:06:48 +08:00
protected void Start()
{
2025-01-24 16:21:00 +08:00
#if UNITY_EDITOR
2025-01-26 20:55:39 +08:00
int defaultMode = (int)m_GamePlayMode;
m_GamePlayMode = (EPlayMode)UnityEditor.EditorPrefs.GetInt(PrefsKey, defaultMode);
2025-01-23 19:06:48 +08:00
#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>
2025-01-24 16:21:00 +08:00
public async UniTask<bool> InitPackageAsync(string packageName = "", string host = "", string fallbackHostServer = "", bool isDefaultPackage = true)
2025-01-23 19:06:48 +08:00
{
if (m_ResourceManager == null)
{
Log.Error("Resource component is invalid.");
return false;
}
2025-01-24 16:21:00 +08:00
if (string.IsNullOrEmpty(packageName))
{
packageName = m_defaultPackageName;
}
2025-02-06 17:59:35 +08:00
return await m_ResourceManager.InitPackageAsync(packageName, host, fallbackHostServer, m_DecryptionServices, isDefaultPackage);
2025-01-23 19:06:48 +08:00
}
#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>
2025-02-06 17:59:35 +08:00
public ClearCacheFilesOperation ClearUnusedCacheFilesAsync(EFileClearMode clearMode, string customPackageName = "")
2025-01-23 19:06:48 +08:00
{
var package = string.IsNullOrEmpty(customPackageName)
? YooAssets.GetPackage(m_defaultPackageName)
: YooAssets.GetPackage(customPackageName);
2025-02-06 17:59:35 +08:00
return package.ClearCacheFilesAsync(clearMode);
2025-01-23 19:06:48 +08:00
}
#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
}
2025-01-24 16:21:00 +08:00
}