Compare commits

...

18 Commits

Author SHA1 Message Date
ALEXTANG
ff613e4130 更新修复导入图集初始化信息不全的bug
更新修复导入图集初始化信息不全的bug
2023-11-20 17:49:08 +08:00
ALEXTANG
fea1ae2278 Merge pull request #59 from AlanWeekend/main
优化分包资源下载逻辑,统一WebGL平台与其他平台的远程热更资源引用方式
2023-11-20 11:56:04 +08:00
Weekend
866c440479 add:初始化Package流程中增加webgl平台更新update配置 2023-11-19 02:01:15 +08:00
Weekend
48ff839d64 Merge branch 'main' of https://github.com/AlanWeekend/TEngine 2023-11-19 01:43:59 +08:00
Weekend
69be3cfa23 update:统一WebGL平台与其他平台的远程热更资源引用方式 2023-11-19 01:41:47 +08:00
Weekend
5f2c27ecf0 Merge branch 'ALEXTANGXIAO:main' into main 2023-11-18 21:46:00 +08:00
Weekend
ef17cd851b add:优化分包下载 2023-11-18 21:44:24 +08:00
ALEXTANG
f186d6b058 Merge pull request #58 from AlanWeekend/main
增加初始化指定资源包操作,单独下载指定地址的资源文件
2023-11-16 10:52:14 +08:00
Weekend
4385123976 add:设置图片资源支持从指定资源包中加载 2023-11-15 15:39:04 +08:00
Weekend
1334dc30f9 Merge branch 'main' of https://github.com/AlanWeekend/TEngine 2023-11-15 15:15:11 +08:00
Weekend
af822add2c add:下载资源包中指定地址的资源文件 2023-11-15 15:14:47 +08:00
Weekend
ffb1f214ad Merge branch 'ALEXTANGXIAO:main' into main 2023-11-15 14:41:45 +08:00
Weekend
213aaed426 add:初始化指定资源包 2023-11-15 14:40:35 +08:00
ALEXTANG
623d301e41 修正异步创建子Widget时SetParent的问题
修正异步创建子Widget时SetParent的问题
2023-11-15 14:06:49 +08:00
ALEXTANG
2870383afe Resource模块支持操作指定资源包的资源
Resource模块支持操作指定资源包的资源
2023-11-15 10:48:28 +08:00
ALEXTANG
1ad435958a Merge pull request #57 from AlanWeekend/main
add:Resource模块支持操作指定资源包的资源
2023-11-15 10:08:53 +08:00
Weekend
386787c6ec add:Resource模块支持操作指定资源包的资源 2023-11-15 00:14:07 +08:00
ALEXTANG
cd65dde4c3 ReleasePreLoadAssets修正在webgl模式下Shutdown的问题
ReleasePreLoadAssets修正在webgl模式下Shutdown的问题
2023-11-14 16:00:09 +08:00
11 changed files with 727 additions and 410 deletions

View File

@@ -29,7 +29,8 @@ namespace GameMain
private async UniTaskVoid InitPackage(ProcedureOwner procedureOwner) private async UniTaskVoid InitPackage(ProcedureOwner procedureOwner)
{ {
if (GameModule.Resource.PlayMode == EPlayMode.HostPlayMode) if (GameModule.Resource.PlayMode == EPlayMode.HostPlayMode ||
GameModule.Resource.PlayMode == EPlayMode.WebPlayMode)
{ {
if (SettingsUtils.EnableUpdateData()) if (SettingsUtils.EnableUpdateData())
{ {
@@ -44,7 +45,8 @@ namespace GameMain
if (!string.IsNullOrEmpty(updateData.FallbackHostServerURL)) if (!string.IsNullOrEmpty(updateData.FallbackHostServerURL))
{ {
SettingsUtils.FrameworkGlobalSettings.FallbackHostServerURL = updateData.FallbackHostServerURL; SettingsUtils.FrameworkGlobalSettings.FallbackHostServerURL =
updateData.FallbackHostServerURL;
} }
} }
} }
@@ -60,9 +62,9 @@ namespace GameMain
{ {
//热更新阶段文本初始化 //热更新阶段文本初始化
LoadText.Instance.InitConfigData(null); LoadText.Instance.InitConfigData(null);
GameEvent.Send(RuntimeId.ToRuntimeId("RefreshVersion")); GameEvent.Send(RuntimeId.ToRuntimeId("RefreshVersion"));
EPlayMode playMode = GameModule.Resource.PlayMode; EPlayMode playMode = GameModule.Resource.PlayMode;
// 编辑器模式。 // 编辑器模式。
@@ -107,7 +109,9 @@ namespace GameMain
// 打开启动UI。 // 打开启动UI。
UILoadMgr.Show(UIDefine.UILoadUpdate, $"资源初始化失败!"); UILoadMgr.Show(UIDefine.UILoadUpdate, $"资源初始化失败!");
UILoadTip.ShowMessageBox($"资源初始化失败!点击确认重试 \n \n <color=#FF0000>原因{initializationOperation.Error}</color>", MessageShowType.TwoButton, UILoadTip.ShowMessageBox(
$"资源初始化失败!点击确认重试 \n \n <color=#FF0000>原因{initializationOperation.Error}</color>",
MessageShowType.TwoButton,
LoadStyle.StyleEnum.Style_Retry LoadStyle.StyleEnum.Style_Retry
, () => { Retry(procedureOwner); }, UnityEngine.Application.Quit); , () => { Retry(procedureOwner); }, UnityEngine.Application.Quit);
} }

View File

@@ -4,6 +4,7 @@ using System.IO;
using UnityEditor; using UnityEditor;
using UnityEditor.U2D; using UnityEditor.U2D;
using UnityEngine; using UnityEngine;
using UnityEngine.U2D;
using Object = UnityEngine.Object; using Object = UnityEngine.Object;
/// <summary> /// <summary>
@@ -55,6 +56,33 @@ public static class EditorSpriteSaveInfo
} }
EditorApplication.update += CheckDirty; EditorApplication.update += CheckDirty;
//读取所有图集信息
string[] findAssets = AssetDatabase.FindAssets("t:SpriteAtlas", new[] { NormalAtlasDir });
foreach (var findAsset in findAssets)
{
var path = AssetDatabase.GUIDToAssetPath(findAsset);
SpriteAtlas sa = AssetDatabase.LoadAssetAtPath(path, typeof(SpriteAtlas)) as SpriteAtlas;
if (sa == null)
{
Debug.LogError($"加载图集数据{path}失败");
continue;
}
string atlasName = Path.GetFileNameWithoutExtension(path);
var objects = sa.GetPackables();
foreach (var o in objects)
{
if (!m_allASprites.TryGetValue(atlasName, out var list))
{
list = new List<string>();
m_allASprites.Add(atlasName, list);
}
list.Add(AssetDatabase.GetAssetPath(o));
}
}
m_inited = true;
} }
public static void CheckDirty() public static void CheckDirty()

View File

@@ -132,7 +132,9 @@ namespace TEngine
/// <param name="spriteName">图片名称。</param> /// <param name="spriteName">图片名称。</param>
/// <param name="isSetNativeSize">是否使用原生分辨率。</param> /// <param name="isSetNativeSize">是否使用原生分辨率。</param>
/// <param name="isAsync">是否使用异步加载。</param> /// <param name="isAsync">是否使用异步加载。</param>
public static void SetSprite(this UnityEngine.UI.Image image, string spriteName, bool isSetNativeSize = false, bool isAsync = false) /// <param name="customPackageName">指定资源包的名称。不传使用默认资源包</param>
public static void SetSprite(this UnityEngine.UI.Image image, string spriteName, bool isSetNativeSize = false,
bool isAsync = false, string customPackageName = "")
{ {
if (image == null) if (image == null)
{ {
@@ -147,7 +149,8 @@ namespace TEngine
{ {
if (!isAsync) if (!isAsync)
{ {
image.sprite = GameModule.Resource.LoadAsset<Sprite>(spriteName); image.sprite =
GameModule.Resource.LoadAsset<Sprite>(spriteName, customPackageName: customPackageName);
if (isSetNativeSize) if (isSetNativeSize)
{ {
image.SetNativeSize(); image.SetNativeSize();
@@ -167,7 +170,7 @@ namespace TEngine
{ {
image.SetNativeSize(); image.SetNativeSize();
} }
}); }, customPackageName: customPackageName);
} }
} }
} }
@@ -178,7 +181,9 @@ namespace TEngine
/// <param name="spriteRenderer">Image组件。</param> /// <param name="spriteRenderer">Image组件。</param>
/// <param name="spriteName">图片名称。</param> /// <param name="spriteName">图片名称。</param>
/// <param name="isAsync">是否使用异步加载。</param> /// <param name="isAsync">是否使用异步加载。</param>
public static void SetSprite(this SpriteRenderer spriteRenderer, string spriteName, bool isAsync = false) /// <param name="customPackageName">指定资源包的名称。不传使用默认资源包</param>
public static void SetSprite(this SpriteRenderer spriteRenderer, string spriteName, bool isAsync = false,
string customPackageName = "")
{ {
if (spriteRenderer == null) if (spriteRenderer == null)
{ {
@@ -193,7 +198,8 @@ namespace TEngine
{ {
if (!isAsync) if (!isAsync)
{ {
spriteRenderer.sprite = GameModule.Resource.LoadAsset<Sprite>(spriteName); spriteRenderer.sprite =
GameModule.Resource.LoadAsset<Sprite>(spriteName, customPackageName: customPackageName);
} }
else else
{ {
@@ -205,11 +211,11 @@ namespace TEngine
} }
spriteRenderer.sprite = operation.AssetObject as Sprite; spriteRenderer.sprite = operation.AssetObject as Sprite;
}); }, customPackageName: customPackageName);
} }
} }
} }
/// <summary> /// <summary>
/// 查找子节点。 /// 查找子节点。
/// </summary> /// </summary>
@@ -221,7 +227,7 @@ namespace TEngine
var findTrans = transform.Find(path); var findTrans = transform.Find(path);
return findTrans != null ? findTrans : null; return findTrans != null ? findTrans : null;
} }
/// <summary> /// <summary>
/// 根据名字找到子节点主要用于dummy接口。 /// 根据名字找到子节点主要用于dummy接口。
/// </summary> /// </summary>
@@ -252,7 +258,7 @@ namespace TEngine
return null; return null;
} }
[TypeInferenceRule(TypeInferenceRules.TypeReferencedByFirstArgument)] [TypeInferenceRule(TypeInferenceRules.TypeReferencedByFirstArgument)]
public static Component FindChildComponent(this Type type, Transform transform, string path) public static Component FindChildComponent(this Type type, Transform transform, string path)
{ {
@@ -264,7 +270,7 @@ namespace TEngine
return null; return null;
} }
public static T FindChildComponent<T>(this Transform transform, string path) where T : Component public static T FindChildComponent<T>(this Transform transform, string path) where T : Component
{ {
var findTrans = transform.Find(path); var findTrans = transform.Find(path);

View File

@@ -14,6 +14,7 @@ namespace TEngine
{ {
private int _instanceID = 0; private int _instanceID = 0;
private string _assetLocation; private string _assetLocation;
private string _packageName;
private AssetGroup _assetGroup; private AssetGroup _assetGroup;
private AssetOperationHandle _operationHandle; private AssetOperationHandle _operationHandle;
@@ -32,6 +33,11 @@ namespace TEngine
/// </summary> /// </summary>
public string AssetLocation => _assetLocation; public string AssetLocation => _assetLocation;
/// <summary>
/// 资源包名称。
/// </summary>
public string PackageName => _packageName;
/// <summary> /// <summary>
/// 脏初始化资源分组。 /// 脏初始化资源分组。
/// </summary> /// </summary>
@@ -49,10 +55,13 @@ namespace TEngine
/// <param name="operation">资源操作句柄。</param> /// <param name="operation">资源操作句柄。</param>
/// <param name="assetLocation">资源定位地址。</param> /// <param name="assetLocation">资源定位地址。</param>
/// <param name="parent">父级资源引用。(NullAble)</param> /// <param name="parent">父级资源引用。(NullAble)</param>
public void Bind(AssetOperationHandle operation, string assetLocation, AssetReference parent = null) /// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
public void Bind(AssetOperationHandle operation, string assetLocation, AssetReference parent = null,
string packageName = "")
{ {
_operationHandle = operation; _operationHandle = operation;
this._assetLocation = assetLocation; this._assetLocation = assetLocation;
this._packageName = packageName;
_instanceID = gameObject.GetInstanceID(); _instanceID = gameObject.GetInstanceID();
if (parent != null) if (parent != null)
{ {
@@ -183,7 +192,8 @@ namespace TEngine
/// <param name="assetOperationHandle">资源操作句柄。</param> /// <param name="assetOperationHandle">资源操作句柄。</param>
/// <returns>资源实例。</returns> /// <returns>资源实例。</returns>
// ReSharper disable once ParameterHidesMember // ReSharper disable once ParameterHidesMember
public T LoadAsset<T>(string assetName, Transform parent, out AssetOperationHandle assetOperationHandle) where T : Object public T LoadAsset<T>(string assetName, Transform parent, out AssetOperationHandle assetOperationHandle)
where T : Object
{ {
DirtyInitAssetGroup(); DirtyInitAssetGroup();
return _assetGroup.LoadAsset<T>(assetName, parent, out assetOperationHandle); return _assetGroup.LoadAsset<T>(assetName, parent, out assetOperationHandle);
@@ -195,7 +205,8 @@ namespace TEngine
/// <param name="assetName">要加载的实例名称。</param> /// <param name="assetName">要加载的实例名称。</param>
/// <param name="cancellationToken">取消操作Token。</param> /// <param name="cancellationToken">取消操作Token。</param>
/// <returns>资源实实例。</returns> /// <returns>资源实实例。</returns>
public async UniTask<T> LoadAssetAsync<T>(string assetName, CancellationToken cancellationToken = default) where T : Object public async UniTask<T> LoadAssetAsync<T>(string assetName, CancellationToken cancellationToken = default)
where T : Object
{ {
DirtyInitAssetGroup(); DirtyInitAssetGroup();
return await _assetGroup.LoadAssetAsync<T>(assetName, cancellationToken); return await _assetGroup.LoadAssetAsync<T>(assetName, cancellationToken);
@@ -207,7 +218,8 @@ namespace TEngine
/// <param name="assetName">要加载的游戏物体名称。</param> /// <param name="assetName">要加载的游戏物体名称。</param>
/// <param name="cancellationToken">取消操作Token。</param> /// <param name="cancellationToken">取消操作Token。</param>
/// <returns>异步游戏物体实例。</returns> /// <returns>异步游戏物体实例。</returns>
public async UniTask<GameObject> LoadGameObjectAsync(string assetName, CancellationToken cancellationToken = default) public async UniTask<GameObject> LoadGameObjectAsync(string assetName,
CancellationToken cancellationToken = default)
{ {
DirtyInitAssetGroup(); DirtyInitAssetGroup();
return await _assetGroup.LoadGameObjectAsync(assetName, cancellationToken); return await _assetGroup.LoadGameObjectAsync(assetName, cancellationToken);
@@ -220,9 +232,11 @@ namespace TEngine
/// <param name="handle">资源句柄。</param> /// <param name="handle">资源句柄。</param>
/// <param name="location">资源定位地址。</param> /// <param name="location">资源定位地址。</param>
/// <param name="parent">父级引用。</param> /// <param name="parent">父级引用。</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
/// <returns>资源引用组件。</returns> /// <returns>资源引用组件。</returns>
/// <exception cref="GameFrameworkException">捕获异常。</exception> /// <exception cref="GameFrameworkException">捕获异常。</exception>
public static AssetReference BindAssetReference(GameObject go, AssetOperationHandle handle, string location = "", AssetReference parent = null) public static AssetReference BindAssetReference(GameObject go, AssetOperationHandle handle,
string location = "", AssetReference parent = null, string packageName = "")
{ {
if (go == null) if (go == null)
{ {
@@ -236,7 +250,7 @@ namespace TEngine
var ret = go.GetOrAddComponent<AssetReference>(); var ret = go.GetOrAddComponent<AssetReference>();
ret.Bind(operation: handle, assetLocation: location, parent: parent); ret.Bind(operation: handle, assetLocation: location, parent: parent, packageName: packageName);
return ret; return ret;
} }
@@ -247,9 +261,11 @@ namespace TEngine
/// <param name="go">游戏物体实例。</param> /// <param name="go">游戏物体实例。</param>
/// <param name="location">资源定位地址。</param> /// <param name="location">资源定位地址。</param>
/// <param name="parent">父级引用。</param> /// <param name="parent">父级引用。</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
/// <returns>资源引用组件。</returns> /// <returns>资源引用组件。</returns>
/// <exception cref="GameFrameworkException">捕获异常。</exception> /// <exception cref="GameFrameworkException">捕获异常。</exception>
public static AssetReference BindAssetReference(GameObject go, string location = "", AssetReference parent = null) public static AssetReference BindAssetReference(GameObject go, string location = "",
AssetReference parent = null, string packageName = "")
{ {
if (go == null) if (go == null)
{ {
@@ -258,7 +274,7 @@ namespace TEngine
var ret = go.GetOrAddComponent<AssetReference>(); var ret = go.GetOrAddComponent<AssetReference>();
ret.Bind(operation: null, assetLocation: location, parent: parent); ret.Bind(operation: null, assetLocation: location, parent: parent, packageName: packageName);
return ret; return ret;
} }

View File

@@ -10,18 +10,6 @@ namespace TEngine
public const string RootFolderName = "yoo"; public const string RootFolderName = "yoo";
} }
/// <summary>
/// 内置文件查询服务类。
/// </summary>
public class BuiltinQueryServices : IBuildinQueryServices
{
public bool QueryStreamingAssets(string packageName, string fileName)
{
// 注意fileName包含文件格式
return BuiltinQueryMgr.FileExists(packageName, fileName);
}
}
#if UNITY_EDITOR #if UNITY_EDITOR
/// <summary> /// <summary>
/// 内置资源资源查询帮助类。 /// 内置资源资源查询帮助类。

View File

@@ -2,7 +2,6 @@
using System.Threading; using System.Threading;
using Cysharp.Threading.Tasks; using Cysharp.Threading.Tasks;
using UnityEngine; using UnityEngine;
using UnityEngine.SceneManagement;
using YooAsset; using YooAsset;
namespace TEngine namespace TEngine
@@ -87,8 +86,9 @@ namespace TEngine
/// <summary> /// <summary>
/// 初始化操作。 /// 初始化操作。
/// </summary> /// </summary>
/// <param name="customPackageName">指定资源包的名称。不传使用默认资源包</param>
/// <returns></returns> /// <returns></returns>
InitializationOperation InitPackage(); InitializationOperation InitPackage(string customPackageName = "");
/// <summary> /// <summary>
/// 卸载资源。 /// 卸载资源。
@@ -110,8 +110,9 @@ namespace TEngine
/// 检查资源是否存在。 /// 检查资源是否存在。
/// </summary> /// </summary>
/// <param name="location">要检查资源的名称。</param> /// <param name="location">要检查资源的名称。</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
/// <returns>检查资源是否存在的结果。</returns> /// <returns>检查资源是否存在的结果。</returns>
HasAssetResult HasAsset(string location); HasAssetResult HasAsset(string location, string packageName = "");
/// <summary> /// <summary>
/// 设置默认资源包。 /// 设置默认资源包。
@@ -123,42 +124,48 @@ namespace TEngine
/// 是否需要从远端更新下载。 /// 是否需要从远端更新下载。
/// </summary> /// </summary>
/// <param name="location">资源的定位地址。</param> /// <param name="location">资源的定位地址。</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
/// <returns>是否需要从远端下载。</returns> /// <returns>是否需要从远端下载。</returns>
bool IsNeedDownloadFromRemote(string location); bool IsNeedDownloadFromRemote(string location, string packageName = "");
/// <summary> /// <summary>
/// 是否需要从远端更新下载。 /// 是否需要从远端更新下载。
/// </summary> /// </summary>
/// <param name="assetInfo">资源信息。</param> /// <param name="assetInfo">资源信息。</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
/// <returns>是否需要从远端下载。</returns> /// <returns>是否需要从远端下载。</returns>
bool IsNeedDownloadFromRemote(AssetInfo assetInfo); bool IsNeedDownloadFromRemote(AssetInfo assetInfo, string packageName = "");
/// <summary> /// <summary>
/// 获取资源信息列表。 /// 获取资源信息列表。
/// </summary> /// </summary>
/// <param name="tag">资源标签。</param> /// <param name="tag">资源标签。</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
/// <returns>资源信息列表。</returns> /// <returns>资源信息列表。</returns>
AssetInfo[] GetAssetInfos(string tag); AssetInfo[] GetAssetInfos(string tag, string packageName = "");
/// <summary> /// <summary>
/// 获取资源信息列表。 /// 获取资源信息列表。
/// </summary> /// </summary>
/// <param name="tags">资源标签列表。</param> /// <param name="tags">资源标签列表。</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
/// <returns>资源信息列表。</returns> /// <returns>资源信息列表。</returns>
AssetInfo[] GetAssetInfos(string[] tags); AssetInfo[] GetAssetInfos(string[] tags, string packageName = "");
/// <summary> /// <summary>
/// 获取资源信息。 /// 获取资源信息。
/// </summary> /// </summary>
/// <param name="location">资源的定位地址。</param> /// <param name="location">资源的定位地址。</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
/// <returns>资源信息。</returns> /// <returns>资源信息。</returns>
AssetInfo GetAssetInfo(string location); AssetInfo GetAssetInfo(string location, string packageName = "");
/// <summary> /// <summary>
/// 检查资源定位地址是否有效。 /// 检查资源定位地址是否有效。
/// </summary> /// </summary>
/// <param name="location">资源的定位地址。</param> /// <param name="location">资源的定位地址。</param>
bool CheckLocationValid(string location); /// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
bool CheckLocationValid(string location, string packageName = "");
/// <summary> /// <summary>
/// 同步加载资源。 /// 同步加载资源。
@@ -166,9 +173,11 @@ namespace TEngine
/// <param name="location">资源的定位地址。</param> /// <param name="location">资源的定位地址。</param>
/// <param name="needInstance">是否需要实例化。</param> /// <param name="needInstance">是否需要实例化。</param>
/// <param name="needCache">是否需要缓存。</param> /// <param name="needCache">是否需要缓存。</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
/// <typeparam name="T">要加载资源的类型。</typeparam> /// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>资源实例。</returns> /// <returns>资源实例。</returns>
T LoadAsset<T>(string location, bool needInstance, bool needCache = false) where T : Object; T LoadAsset<T>(string location, bool needInstance, bool needCache = false, string packageName = "")
where T : Object;
/// <summary> /// <summary>
/// 同步加载资源。 /// 同步加载资源。
@@ -177,9 +186,11 @@ namespace TEngine
/// <param name="parent">父节点位置。</param> /// <param name="parent">父节点位置。</param>
/// <param name="needInstance">是否需要实例化。</param> /// <param name="needInstance">是否需要实例化。</param>
/// <param name="needCache">是否需要缓存。</param> /// <param name="needCache">是否需要缓存。</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
/// <typeparam name="T">要加载资源的类型。</typeparam> /// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>资源实例。</returns> /// <returns>资源实例。</returns>
T LoadAsset<T>(string location, Transform parent, bool needInstance, bool needCache = false) where T : Object; T LoadAsset<T>(string location, Transform parent, bool needInstance, bool needCache = false,
string packageName = "") where T : Object;
/// <summary> /// <summary>
/// 同步加载资源。 /// 同步加载资源。
@@ -187,9 +198,11 @@ namespace TEngine
/// <param name="handle">资源操作句柄。</param> /// <param name="handle">资源操作句柄。</param>
/// <param name="location">资源的定位地址。</param> /// <param name="location">资源的定位地址。</param>
/// <param name="needCache">是否需要缓存。</param> /// <param name="needCache">是否需要缓存。</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
/// <typeparam name="T">要加载资源的类型。</typeparam> /// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>资源实例。</returns> /// <returns>资源实例。</returns>
T LoadAsset<T>(string location, out AssetOperationHandle handle, bool needCache = false) where T : Object; T LoadAsset<T>(string location, out AssetOperationHandle handle, bool needCache = false,
string packageName = "") where T : Object;
/// <summary> /// <summary>
/// 同步加载资源。 /// 同步加载资源。
@@ -198,55 +211,68 @@ namespace TEngine
/// <param name="handle">资源操作句柄。</param> /// <param name="handle">资源操作句柄。</param>
/// <param name="parent">父节点位置。</param> /// <param name="parent">父节点位置。</param>
/// <param name="needCache">是否需要缓存。</param> /// <param name="needCache">是否需要缓存。</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
/// <typeparam name="T">要加载资源的类型。</typeparam> /// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>资源实例。</returns> /// <returns>资源实例。</returns>
T LoadAsset<T>(string location, Transform parent, out AssetOperationHandle handle, bool needCache = false) where T : Object; T LoadAsset<T>(string location, Transform parent, out AssetOperationHandle handle, bool needCache = false,
string packageName = "")
where T : Object;
/// <summary> /// <summary>
/// 同步加载资源并获取句柄。 /// 同步加载资源并获取句柄。
/// </summary> /// </summary>
/// <param name="location">资源的定位地址。</param> /// <param name="location">资源的定位地址。</param>
/// <param name="needCache">是否需要缓存。</param> /// <param name="needCache">是否需要缓存。</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
/// <typeparam name="T">要加载资源的类型。</typeparam> /// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>同步加载资源句柄。</returns> /// <returns>同步加载资源句柄。</returns>
AssetOperationHandle LoadAssetGetOperation<T>(string location, bool needCache = false) where T : Object; AssetOperationHandle LoadAssetGetOperation<T>(string location, bool needCache = false, string packageName = "")
where T : Object;
/// <summary> /// <summary>
/// 异步加载资源并获取句柄。 /// 异步加载资源并获取句柄。
/// </summary> /// </summary>
/// <param name="location">资源的定位地址。</param> /// <param name="location">资源的定位地址。</param>
/// <param name="needCache">是否需要缓存。</param> /// <param name="needCache">是否需要缓存。</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
/// <typeparam name="T">要加载资源的类型。</typeparam> /// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>异步加载资源句柄。</returns> /// <returns>异步加载资源句柄。</returns>
AssetOperationHandle LoadAssetAsyncHandle<T>(string location, bool needCache = false) where T : Object; AssetOperationHandle LoadAssetAsyncHandle<T>(string location, bool needCache = false, string packageName = "")
where T : Object;
/// <summary> /// <summary>
/// 同步加载子资源对象。 /// 同步加载子资源对象。
/// </summary> /// </summary>
/// <typeparam name="TObject">资源类型。</typeparam> /// <typeparam name="TObject">资源类型。</typeparam>
/// <param name="location">资源的定位地址。</param> /// <param name="location">资源的定位地址。</param>
public SubAssetsOperationHandle LoadSubAssetsSync<TObject>(string location) where TObject : Object; /// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
public SubAssetsOperationHandle LoadSubAssetsSync<TObject>(string location, string packageName = "")
where TObject : Object;
/// <summary> /// <summary>
/// 异步加载子资源对象 /// 异步加载子资源对象
/// </summary> /// </summary>
/// <typeparam name="TObject">资源类型。</typeparam> /// <typeparam name="TObject">资源类型。</typeparam>
/// <param name="location">资源的定位地址。</param> /// <param name="location">资源的定位地址。</param>
public SubAssetsOperationHandle LoadSubAssetsAsync<TObject>(string location) where TObject : Object; /// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
public SubAssetsOperationHandle LoadSubAssetsAsync<TObject>(string location, string packageName = "")
where TObject : Object;
/// <summary> /// <summary>
/// 同步加载子资源对象。 /// 同步加载子资源对象。
/// </summary> /// </summary>
/// <param name="assetInfo">资源信息。</param> /// <param name="assetInfo">资源信息。</param>
public SubAssetsOperationHandle LoadSubAssetsSync(AssetInfo assetInfo); /// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
public SubAssetsOperationHandle LoadSubAssetsSync(AssetInfo assetInfo, string packageName = "");
/// <summary> /// <summary>
/// 通过Tag加载资源对象集合。 /// 通过Tag加载资源对象集合。
/// </summary> /// </summary>
/// <param name="assetTag">资源标识。</param> /// <param name="assetTag">资源标识。</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
/// <typeparam name="T">资源类型。</typeparam> /// <typeparam name="T">资源类型。</typeparam>
/// <returns>资源对象集合。</returns> /// <returns>资源对象集合。</returns>
UniTask<List<T>> LoadAssetsByTagAsync<T>(string assetTag) where T : UnityEngine.Object; UniTask<List<T>> LoadAssetsByTagAsync<T>(string assetTag, string packageName = "") where T : UnityEngine.Object;
/// <summary> /// <summary>
/// 异步加载资源。 /// 异步加载资源。
@@ -255,9 +281,11 @@ namespace TEngine
/// <param name="cancellationToken">取消操作Token。</param> /// <param name="cancellationToken">取消操作Token。</param>
/// <param name="needInstance">是否需要实例化。</param> /// <param name="needInstance">是否需要实例化。</param>
/// <param name="needCache">是否需要缓存。</param> /// <param name="needCache">是否需要缓存。</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
/// <typeparam name="T">要加载资源的类型。</typeparam> /// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>异步资源实例。</returns> /// <returns>异步资源实例。</returns>
UniTask<T> LoadAssetAsync<T>(string location, CancellationToken cancellationToken = default, bool needInstance = true, bool needCache = false) where T : Object; UniTask<T> LoadAssetAsync<T>(string location, CancellationToken cancellationToken = default,
bool needInstance = true, bool needCache = false, string packageName = "") where T : Object;
/// <summary> /// <summary>
/// 异步加载游戏物体。 /// 异步加载游戏物体。
@@ -265,8 +293,10 @@ namespace TEngine
/// <param name="location">资源定位地址。</param> /// <param name="location">资源定位地址。</param>
/// <param name="cancellationToken">取消操作Token。</param> /// <param name="cancellationToken">取消操作Token。</param>
/// <param name="needCache">是否需要缓存。</param> /// <param name="needCache">是否需要缓存。</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
/// <returns>异步游戏物体实例。</returns> /// <returns>异步游戏物体实例。</returns>
UniTask<GameObject> LoadGameObjectAsync(string location, CancellationToken cancellationToken = default, bool needCache = false); UniTask<GameObject> LoadGameObjectAsync(string location, CancellationToken cancellationToken = default,
bool needCache = false, string packageName = "");
/// <summary> /// <summary>
/// 异步加载游戏物体。 /// 异步加载游戏物体。
@@ -275,16 +305,20 @@ namespace TEngine
/// <param name="parent">父节点位置。</param> /// <param name="parent">父节点位置。</param>
/// <param name="cancellationToken">取消操作Token。</param> /// <param name="cancellationToken">取消操作Token。</param>
/// <param name="needCache">是否需要缓存。</param> /// <param name="needCache">是否需要缓存。</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
/// <returns>异步游戏物体实例。</returns> /// <returns>异步游戏物体实例。</returns>
UniTask<GameObject> LoadGameObjectAsync(string location, Transform parent, CancellationToken cancellationToken = default, bool needCache = false); UniTask<GameObject> LoadGameObjectAsync(string location, Transform parent,
CancellationToken cancellationToken = default, bool needCache = false, string packageName = "");
/// <summary> /// <summary>
/// 异步加载原生文件。 /// 异步加载原生文件。
/// </summary> /// </summary>
/// <param name="location">资源定位地址。</param> /// <param name="location">资源定位地址。</param>
/// <param name="cancellationToken">取消操作Token。</param> /// <param name="cancellationToken">取消操作Token。</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
/// <returns>原生文件资源实例。</returns> /// <returns>原生文件资源实例。</returns>
UniTask<RawFileOperationHandle> LoadRawAssetAsync(string location, CancellationToken cancellationToken = default); UniTask<RawFileOperationHandle> LoadRawAssetAsync(string location,
CancellationToken cancellationToken = default, string packageName = "");
/// <summary> /// <summary>
/// 异步加载子文件。 /// 异步加载子文件。
@@ -292,32 +326,38 @@ namespace TEngine
/// <param name="location">资源定位地址。</param> /// <param name="location">资源定位地址。</param>
/// <param name="assetName">子资源名称。</param> /// <param name="assetName">子资源名称。</param>
/// <param name="cancellationToken">取消操作Token。</param> /// <param name="cancellationToken">取消操作Token。</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
/// <typeparam name="T">资源实例类型。</typeparam> /// <typeparam name="T">资源实例类型。</typeparam>
/// <returns>原生文件资源实例。</returns> /// <returns>原生文件资源实例。</returns>
UniTask<T> LoadSubAssetAsync<T>(string location, string assetName, CancellationToken cancellationToken = default) where T : Object; UniTask<T> LoadSubAssetAsync<T>(string location, string assetName,
CancellationToken cancellationToken = default, string packageName = "") where T : Object;
/// <summary> /// <summary>
/// 异步加载所有子文件。 /// 异步加载所有子文件。
/// </summary> /// </summary>
/// <param name="location">资源定位地址。</param> /// <param name="location">资源定位地址。</param>
/// <param name="cancellationToken">取消操作Token。</param> /// <param name="cancellationToken">取消操作Token。</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
/// <typeparam name="T">资源实例类型。</typeparam> /// <typeparam name="T">资源实例类型。</typeparam>
/// <returns>原生文件资源实例。</returns> /// <returns>原生文件资源实例。</returns>
UniTask<T[]> LoadAllSubAssetAsync<T>(string location, CancellationToken cancellationToken = default) where T : Object; UniTask<T[]> LoadAllSubAssetAsync<T>(string location, CancellationToken cancellationToken = default,
string packageName = "") where T : Object;
/// <summary> /// <summary>
/// 放入预加载对象。 /// 放入预加载对象。
/// </summary> /// </summary>
/// <param name="location">资源定位地址。</param> /// <param name="location">资源定位地址。</param>
/// <param name="assetObject">预加载对象。</param> /// <param name="assetObject">预加载对象。</param>
public void PushPreLoadAsset(string location, Object assetObject); /// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
public void PushPreLoadAsset(string location, Object assetObject, string packageName = "");
/// <summary> /// <summary>
/// 获取预加载的实例对象。 /// 获取预加载的实例对象。
/// </summary> /// </summary>
/// <param name="location">资源定位地址。</param> /// <param name="location">资源定位地址。</param>
/// <typeparam name="T">资源实例类型。</typeparam> /// <typeparam name="T">资源实例类型。</typeparam>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
/// <returns>预加载对象。</returns> /// <returns>预加载对象。</returns>
public T GetPreLoadAsset<T>(string location) where T : Object; public T GetPreLoadAsset<T>(string location, string packageName = "") where T : Object;
} }
} }

View File

@@ -19,6 +19,7 @@ namespace TEngine
} }
private readonly string _tag; private readonly string _tag;
private readonly string _packageName; // 指定资源包的名称
private ESteps _steps = ESteps.None; private ESteps _steps = ESteps.None;
private List<AssetOperationHandle> _handles; private List<AssetOperationHandle> _handles;
@@ -28,9 +29,10 @@ namespace TEngine
public List<TObject> AssetObjects { private set; get; } public List<TObject> AssetObjects { private set; get; }
public LoadAssetsByTagOperation(string tag) public LoadAssetsByTagOperation(string tag, string packageName)
{ {
_tag = tag; _tag = tag;
_packageName = packageName;
} }
protected override void OnStart() protected override void OnStart()
@@ -45,11 +47,32 @@ namespace TEngine
if (_steps == ESteps.LoadAssets) if (_steps == ESteps.LoadAssets)
{ {
AssetInfo[] assetInfos = YooAssets.GetAssetInfos(_tag); AssetInfo[] assetInfos;
if (string.IsNullOrEmpty(_packageName))
{
assetInfos = YooAssets.GetAssetInfos(_tag);
}
else
{
var package = YooAssets.GetPackage(_packageName);
assetInfos = package.GetAssetInfos(_tag);
}
_handles = new List<AssetOperationHandle>(assetInfos.Length); _handles = new List<AssetOperationHandle>(assetInfos.Length);
foreach (var assetInfo in assetInfos) foreach (var assetInfo in assetInfos)
{ {
var handle = YooAssets.LoadAssetAsync(assetInfo); AssetOperationHandle handle;
if (string.IsNullOrEmpty(_packageName))
{
handle = YooAssets.LoadAssetAsync(assetInfo);
}
else
{
var package = YooAssets.GetPackage(_packageName);
handle = package.LoadAssetAsync(assetInfo);
}
_handles.Add(handle); _handles.Add(handle);
} }
@@ -101,7 +124,7 @@ namespace TEngine
SetFinish(true); SetFinish(true);
} }
} }
private void SetFinish(bool succeed, string error = "") private void SetFinish(bool succeed, string error = "")
{ {
Error = error; Error = error;

View File

@@ -12,7 +12,7 @@ namespace TEngine
private class GameDecryptionServices : IDecryptionServices private class GameDecryptionServices : IDecryptionServices
{ {
private const byte OffSet = 32; private const byte OffSet = 32;
public ulong LoadFromFileOffset(DecryptFileInfo fileInfo) public ulong LoadFromFileOffset(DecryptFileInfo fileInfo)
{ {
return OffSet; return OffSet;
@@ -25,7 +25,8 @@ namespace TEngine
public Stream LoadFromStream(DecryptFileInfo fileInfo) public Stream LoadFromStream(DecryptFileInfo fileInfo)
{ {
BundleStream bundleStream = new BundleStream(fileInfo.FilePath, FileMode.Open, FileAccess.Read, FileShare.Read); BundleStream bundleStream =
new BundleStream(fileInfo.FilePath, FileMode.Open, FileAccess.Read, FileShare.Read);
return bundleStream; return bundleStream;
} }
@@ -34,7 +35,7 @@ namespace TEngine
return 1024; return 1024;
} }
} }
/// <summary> /// <summary>
/// 默认的分发资源查询服务类 /// 默认的分发资源查询服务类
/// </summary> /// </summary>
@@ -44,40 +45,66 @@ namespace TEngine
{ {
throw new NotImplementedException(); throw new NotImplementedException();
} }
public bool QueryDeliveryFiles(string packageName, string fileName) public bool QueryDeliveryFiles(string packageName, string fileName)
{ {
return false; return false;
} }
} }
/// <summary> /// <summary>
/// 远程文件查询服务类。 /// 远程文件查询服务类。
/// </summary> /// </summary>
private class RemoteServices: IRemoteServices private class RemoteServices : IRemoteServices
{ {
private readonly string _defaultHostServer; private readonly string _defaultHostServer;
private readonly string _fallbackHostServer; private readonly string _fallbackHostServer;
private string _packageName;
public RemoteServices() public RemoteServices(string packageName)
{ {
_defaultHostServer = SettingsUtils.FrameworkGlobalSettings.HostServerURL; _defaultHostServer = SettingsUtils.FrameworkGlobalSettings.HostServerURL;
_fallbackHostServer = SettingsUtils.FrameworkGlobalSettings.FallbackHostServerURL; _fallbackHostServer = SettingsUtils.FrameworkGlobalSettings.FallbackHostServerURL;
_packageName = packageName;
} }
public RemoteServices(string defaultHostServer, string fallbackHostServer) public RemoteServices(string defaultHostServer, string fallbackHostServer)
{ {
_defaultHostServer = defaultHostServer; _defaultHostServer = defaultHostServer;
_fallbackHostServer = fallbackHostServer; _fallbackHostServer = fallbackHostServer;
} }
public string GetRemoteMainURL(string fileName) public string GetRemoteMainURL(string fileName)
{ {
return $"{_defaultHostServer}/{fileName}"; return $"{_defaultHostServer}/{_packageName}/{fileName}";
} }
public string GetRemoteFallbackURL(string fileName) public string GetRemoteFallbackURL(string fileName)
{ {
return $"{_fallbackHostServer}/{fileName}"; return $"{_defaultHostServer}/{_packageName}/{fileName}";
}
}
/// <summary>
/// 内置文件查询服务类。
/// </summary>
public class BuiltinQueryServices : IBuildinQueryServices
{
public bool QueryStreamingAssets(string packageName, string fileName)
{
// 注意fileName包含文件格式
return BuiltinQueryMgr.FileExists(packageName, fileName);
}
}
/// <summary>
/// WebGL内置文件查询服务类。WebGL平台不需要内置查询直接使用远程热更资源。
/// </summary>
public class WebGLBuiltinQueryServices : IBuildinQueryServices
{
public bool QueryStreamingAssets(string packageName, string fileName)
{
return true;
} }
} }
} }
@@ -86,7 +113,8 @@ namespace TEngine
{ {
public const byte KEY = 128; public const byte KEY = 128;
public BundleStream(string path, FileMode mode, FileAccess access, FileShare share) : base(path, mode, access, share) public BundleStream(string path, FileMode mode, FileAccess access, FileShare share) : base(path, mode, access,
share)
{ {
} }

View File

@@ -15,7 +15,7 @@ namespace TEngine
#region Propreties #region Propreties
/// <summary> /// <summary>
/// 资源包名称。 /// 默认资源包名称。
/// </summary> /// </summary>
public string PackageName { get; set; } = "DefaultPackage"; public string PackageName { get; set; } = "DefaultPackage";
@@ -101,9 +101,9 @@ namespace TEngine
internal override void Shutdown() internal override void Shutdown()
{ {
ReleasePreLoadAssets(); ReleasePreLoadAssets(isShutDown: true);
#if !UNITY_WEBGL #if !UNITY_WEBGL
YooAssets.Destroy(); YooAssets.Destroy();
#endif #endif
ResourcePool.Destroy(); ResourcePool.Destroy();
} }
@@ -120,6 +120,7 @@ namespace TEngine
handle = null; handle = null;
} }
} }
iter.Dispose(); iter.Dispose();
_releaseMaps.Clear(); _releaseMaps.Clear();
@@ -133,10 +134,12 @@ namespace TEngine
handle = null; handle = null;
} }
} }
iter.Dispose(); iter.Dispose();
_operationHandlesMaps.Clear(); _operationHandlesMaps.Clear();
_arcCacheTable = new ArcCacheTable<string, AssetOperationHandle>(ARCTableCapacity, OnAddAsset, OnRemoveAsset); _arcCacheTable =
new ArcCacheTable<string, AssetOperationHandle>(ARCTableCapacity, OnAddAsset, OnRemoveAsset);
} }
#endregion #endregion
@@ -205,25 +208,47 @@ namespace TEngine
/// </summary> /// </summary>
/// <param name="location">资源定位地址。</param> /// <param name="location">资源定位地址。</param>
/// <param name="needCache">是否需要缓存。</param> /// <param name="needCache">是否需要缓存。</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
/// <typeparam name="T">资源类型。</typeparam> /// <typeparam name="T">资源类型。</typeparam>
/// <returns>资源句柄。</returns> /// <returns>资源句柄。</returns>
private AssetOperationHandle GetHandleSync<T>(string location, bool needCache = false) where T : Object private AssetOperationHandle GetHandleSync<T>(string location, bool needCache = false, string packageName = "")
where T : Object
{ {
if (!needCache) if (!needCache)
{ {
return YooAssets.LoadAssetSync<T>(location); if (string.IsNullOrEmpty(packageName))
{
return YooAssets.LoadAssetSync<T>(location);
}
var package = YooAssets.GetPackage(packageName);
return package.LoadAssetSync<T>(location);
} }
// 缓存key
var cacheKey = string.IsNullOrEmpty(packageName) || packageName.Equals(PackageName)
? location
: $"{packageName}/{location}";
AssetOperationHandle handle = null; AssetOperationHandle handle = null;
// 尝试从从ARC缓存表取出对象。 // 尝试从从ARC缓存表取出对象。
handle = _arcCacheTable.GetCache(location); handle = _arcCacheTable.GetCache(cacheKey);
if (handle == null) if (handle == null)
{ {
handle = YooAssets.LoadAssetSync<T>(location); if (string.IsNullOrEmpty(packageName))
{
handle = YooAssets.LoadAssetSync<T>(location);
}
else
{
var package = YooAssets.GetPackage(packageName);
handle = package.LoadAssetSync<T>(location);
}
} }
// 对象推入ARC缓存表。 // 对象推入ARC缓存表。
_arcCacheTable.PutCache(location, handle); _arcCacheTable.PutCache(cacheKey, handle);
return handle; return handle;
} }
@@ -232,25 +257,47 @@ namespace TEngine
/// </summary> /// </summary>
/// <param name="location">资源定位地址。</param> /// <param name="location">资源定位地址。</param>
/// <param name="needCache">是否需要缓存。</param> /// <param name="needCache">是否需要缓存。</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
/// <typeparam name="T">资源类型。</typeparam> /// <typeparam name="T">资源类型。</typeparam>
/// <returns>资源句柄。</returns> /// <returns>资源句柄。</returns>
private AssetOperationHandle GetHandleAsync<T>(string location, bool needCache = false) where T : Object private AssetOperationHandle GetHandleAsync<T>(string location, bool needCache = false, string packageName = "")
where T : Object
{ {
if (!needCache) if (!needCache)
{ {
return YooAssets.LoadAssetAsync<T>(location); if (string.IsNullOrEmpty(packageName))
{
return YooAssets.LoadAssetAsync<T>(location);
}
var package = YooAssets.GetPackage(packageName);
return package.LoadAssetAsync<T>(location);
} }
// 缓存key
var cacheKey = string.IsNullOrEmpty(packageName) || packageName.Equals(PackageName)
? location
: $"{packageName}/{location}";
AssetOperationHandle handle = null; AssetOperationHandle handle = null;
// 尝试从从ARC缓存表取出对象。 // 尝试从从ARC缓存表取出对象。
handle = _arcCacheTable.GetCache(location); handle = _arcCacheTable.GetCache(cacheKey);
if (handle == null) if (handle == null)
{ {
handle = YooAssets.LoadAssetAsync<T>(location); if (string.IsNullOrEmpty(packageName))
{
handle = YooAssets.LoadAssetAsync<T>(location);
}
else
{
var package = YooAssets.GetPackage(packageName);
handle = package.LoadAssetAsync<T>(location);
}
} }
// 对象推入ARC缓存表。 // 对象推入ARC缓存表。
_arcCacheTable.PutCache(location, handle); _arcCacheTable.PutCache(cacheKey, handle);
return handle; return handle;
} }
@@ -277,25 +324,32 @@ namespace TEngine
_releaseMaps ??= new Dictionary<string, AssetOperationHandle>(ARCTableCapacity); _releaseMaps ??= new Dictionary<string, AssetOperationHandle>(ARCTableCapacity);
_operationHandlesMaps ??= new Dictionary<string, AssetOperationHandle>(ARCTableCapacity); _operationHandlesMaps ??= new Dictionary<string, AssetOperationHandle>(ARCTableCapacity);
_arcCacheTable ??= new ArcCacheTable<string, AssetOperationHandle>(ARCTableCapacity, OnAddAsset, OnRemoveAsset); _arcCacheTable ??=
new ArcCacheTable<string, AssetOperationHandle>(ARCTableCapacity, OnAddAsset, OnRemoveAsset);
} }
/// <summary> /// <summary>
/// 初始化资源包裹。 /// 初始化资源包裹。
/// </summary> /// </summary>
/// <returns>初始化资源包裹操作句柄。</returns> /// <returns>初始化资源包裹操作句柄。</returns>
public InitializationOperation InitPackage() public InitializationOperation InitPackage(string customPackageName = "")
{ {
// 创建默认的资源包 // 创建默认的资源包
string packageName = PackageName; var targetPackageName = string.IsNullOrEmpty(customPackageName) || customPackageName.Equals(PackageName)
var package = YooAssets.TryGetPackage(packageName); ? PackageName
: customPackageName;
var package = YooAssets.TryGetPackage(targetPackageName);
if (package == null) if (package == null)
{ {
package = YooAssets.CreatePackage(packageName); package = YooAssets.CreatePackage(targetPackageName);
YooAssets.SetDefaultPackage(package);
} }
DefaultPackage = package; // 设置默认资源包
if (targetPackageName.Equals(PackageName))
{
YooAssets.SetDefaultPackage(package);
DefaultPackage = package;
}
#if UNITY_EDITOR #if UNITY_EDITOR
//编辑器模式使用。 //编辑器模式使用。
@@ -311,7 +365,7 @@ namespace TEngine
if (playMode == EPlayMode.EditorSimulateMode) if (playMode == EPlayMode.EditorSimulateMode)
{ {
var createParameters = new EditorSimulateModeParameters(); var createParameters = new EditorSimulateModeParameters();
createParameters.SimulateManifestFilePath = EditorSimulateModeHelper.SimulateBuild(packageName); createParameters.SimulateManifestFilePath = EditorSimulateModeHelper.SimulateBuild(targetPackageName);
initializationOperation = package.InitializeAsync(createParameters); initializationOperation = package.InitializeAsync(createParameters);
} }
@@ -330,7 +384,7 @@ namespace TEngine
createParameters.DecryptionServices = new GameDecryptionServices(); createParameters.DecryptionServices = new GameDecryptionServices();
createParameters.BuildinQueryServices = new BuiltinQueryServices(); createParameters.BuildinQueryServices = new BuiltinQueryServices();
createParameters.DeliveryQueryServices = new DefaultDeliveryQueryServices(); createParameters.DeliveryQueryServices = new DefaultDeliveryQueryServices();
createParameters.RemoteServices = new RemoteServices(); createParameters.RemoteServices = new RemoteServices(targetPackageName);
initializationOperation = package.InitializeAsync(createParameters); initializationOperation = package.InitializeAsync(createParameters);
} }
@@ -340,8 +394,11 @@ namespace TEngine
YooAssets.SetCacheSystemDisableCacheOnWebGL(); YooAssets.SetCacheSystemDisableCacheOnWebGL();
var createParameters = new WebPlayModeParameters(); var createParameters = new WebPlayModeParameters();
createParameters.DecryptionServices = new GameDecryptionServices(); createParameters.DecryptionServices = new GameDecryptionServices();
createParameters.BuildinQueryServices = new BuiltinQueryServices(); createParameters.BuildinQueryServices = new WebGLBuiltinQueryServices();
createParameters.RemoteServices = new RemoteServices(); createParameters.RemoteServices = new RemoteServices(targetPackageName);
// WebGL运行模式下直接使用远程热更资源。
createParameters.BuildinRootDirectory = SettingsUtils.FrameworkGlobalSettings.HostServerURL;
createParameters.SandboxRootDirectory = SettingsUtils.FrameworkGlobalSettings.HostServerURL;
initializationOperation = package.InitializeAsync(createParameters); initializationOperation = package.InitializeAsync(createParameters);
} }
@@ -402,19 +459,29 @@ namespace TEngine
#endif #endif
} }
/// <summary> /// <inheritdoc />
/// 检查资源是否存在。 public HasAssetResult HasAsset(string location, string packageName = "")
/// </summary>
/// <param name="location">要检查资源的名称。</param>
/// <returns>检查资源是否存在的结果。</returns>
public HasAssetResult HasAsset(string location)
{ {
if (string.IsNullOrEmpty(location)) if (string.IsNullOrEmpty(location))
{ {
throw new GameFrameworkException("Asset name is invalid."); throw new GameFrameworkException("Asset name is invalid.");
} }
AssetInfo assetInfo = YooAssets.GetAssetInfo(location); AssetInfo assetInfo;
if (string.IsNullOrEmpty(packageName))
{
assetInfo = YooAssets.GetAssetInfo(location);
}
else
{
var package = YooAssets.GetPackage(packageName);
if (package == null)
{
throw new GameFrameworkException($"The package does not exist. Package Name :{packageName}");
}
assetInfo = package.GetAssetInfo(location);
}
if (!CheckLocationValid(location)) if (!CheckLocationValid(location))
{ {
@@ -445,74 +512,95 @@ namespace TEngine
#region #region
/// <summary> /// <inheritdoc />
/// 是否需要从远端更新下载。 public bool IsNeedDownloadFromRemote(string location, string packageName = "")
/// </summary>
/// <param name="location">资源的定位地址</param>
public bool IsNeedDownloadFromRemote(string location)
{ {
return YooAssets.IsNeedDownloadFromRemote(location); if (string.IsNullOrEmpty(packageName))
{
return YooAssets.IsNeedDownloadFromRemote(location);
}
else
{
var package = YooAssets.GetPackage(packageName);
return package.IsNeedDownloadFromRemote(location);
}
} }
/// <summary> /// <inheritdoc />
/// 是否需要从远端更新下载。 public bool IsNeedDownloadFromRemote(AssetInfo assetInfo, string packageName = "")
/// </summary>
/// <param name="assetInfo">资源信息。</param>
public bool IsNeedDownloadFromRemote(AssetInfo assetInfo)
{ {
return YooAssets.IsNeedDownloadFromRemote(assetInfo); if (string.IsNullOrEmpty(packageName))
{
return YooAssets.IsNeedDownloadFromRemote(assetInfo);
}
else
{
var package = YooAssets.GetPackage(packageName);
return package.IsNeedDownloadFromRemote(assetInfo);
}
} }
/// <summary> /// <inheritdoc />
/// 获取资源信息列表。 public AssetInfo[] GetAssetInfos(string tag, string packageName = "")
/// </summary>
/// <param name="tag">资源标签。</param>
/// <returns>资源信息列表。</returns>
public AssetInfo[] GetAssetInfos(string tag)
{ {
return YooAssets.GetAssetInfos(tag); if (string.IsNullOrEmpty(packageName))
{
return YooAssets.GetAssetInfos(tag);
}
else
{
var package = YooAssets.GetPackage(packageName);
return package.GetAssetInfos(tag);
}
} }
/// <summary> /// <inheritdoc />
/// 获取资源信息列表。 public AssetInfo[] GetAssetInfos(string[] tags, string packageName = "")
/// </summary>
/// <param name="tags">资源标签列表。</param>
/// <returns>资源信息列表。</returns>
public AssetInfo[] GetAssetInfos(string[] tags)
{ {
return YooAssets.GetAssetInfos(tags); if (string.IsNullOrEmpty(packageName))
{
return YooAssets.GetAssetInfos(tags);
}
else
{
var package = YooAssets.GetPackage(packageName);
return package.GetAssetInfos(tags);
}
} }
/// <summary> /// <inheritdoc />
/// 获取资源信息。 public AssetInfo GetAssetInfo(string location, string packageName = "")
/// </summary>
/// <param name="location">资源的定位地址。</param>
/// <returns>资源信息。</returns>
public AssetInfo GetAssetInfo(string location)
{ {
return YooAssets.GetAssetInfo(location); if (string.IsNullOrEmpty(packageName))
{
return YooAssets.GetAssetInfo(location);
}
else
{
var package = YooAssets.GetPackage(packageName);
return package.GetAssetInfo(location);
}
} }
/// <summary> /// <inheritdoc />
/// 检查资源定位地址是否有效。 public bool CheckLocationValid(string location, string packageName = "")
/// </summary>
/// <param name="location">资源的定位地址。</param>
public bool CheckLocationValid(string location)
{ {
return YooAssets.CheckLocationValid(location); if (string.IsNullOrEmpty(packageName))
{
return YooAssets.CheckLocationValid(location);
}
else
{
var package = YooAssets.GetPackage(packageName);
return package.CheckLocationValid(location);
}
} }
#endregion #endregion
/// <summary> /// <inheritdoc />
/// 同步加载资源。 public T LoadAsset<T>(string location, bool needInstance = true, bool needCache = false,
/// </summary> string packageName = "") where T : Object
/// <param name="location">资源的定位地址。</param>
/// <param name="needInstance">是否需要实例化。</param>
/// <param name="needCache">是否需要缓存。</param>
/// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>资源实例。</returns>
public T LoadAsset<T>(string location, bool needInstance = true, bool needCache = false) where T : Object
{ {
if (string.IsNullOrEmpty(location)) if (string.IsNullOrEmpty(location))
{ {
@@ -520,7 +608,7 @@ namespace TEngine
return default; return default;
} }
AssetOperationHandle handle = GetHandleSync<T>(location, needCache); AssetOperationHandle handle = GetHandleSync<T>(location, needCache, packageName);
if (typeof(T) == typeof(GameObject)) if (typeof(T) == typeof(GameObject))
{ {
@@ -529,30 +617,26 @@ namespace TEngine
GameObject gameObject = handle.InstantiateSync(); GameObject gameObject = handle.InstantiateSync();
if (!needCache) if (!needCache)
{ {
AssetReference.BindAssetReference(gameObject, handle, location); AssetReference.BindAssetReference(gameObject, handle, location, packageName: packageName);
} }
return gameObject as T; return gameObject as T;
} }
} }
T ret = handle.AssetObject as T; T ret = handle.AssetObject as T;
if (!needCache) if (!needCache)
{ {
handle.Dispose(); handle.Dispose();
} }
return ret; return ret;
} }
/// <summary> /// <inheritdoc />
/// 同步加载资源。 public T LoadAsset<T>(string location, Transform parent, bool needInstance = true, bool needCache = false,
/// </summary> string packageName = "")
/// <param name="location">资源的定位地址。</param> where T : Object
/// <param name="parent">父节点位置。</param>
/// <param name="needInstance">是否需要实例化。</param>
/// <param name="needCache">是否需要缓存。</param>
/// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>资源实例。</returns>
public T LoadAsset<T>(string location, Transform parent, bool needInstance = true, bool needCache = false) where T : Object
{ {
if (string.IsNullOrEmpty(location)) if (string.IsNullOrEmpty(location))
{ {
@@ -560,7 +644,7 @@ namespace TEngine
return default; return default;
} }
AssetOperationHandle handle = GetHandleSync<T>(location, needCache); AssetOperationHandle handle = GetHandleSync<T>(location, needCache, packageName: packageName);
if (typeof(T) == typeof(GameObject)) if (typeof(T) == typeof(GameObject))
{ {
@@ -569,31 +653,27 @@ namespace TEngine
GameObject gameObject = handle.InstantiateSync(parent); GameObject gameObject = handle.InstantiateSync(parent);
if (!needCache) if (!needCache)
{ {
AssetReference.BindAssetReference(gameObject, handle, location); AssetReference.BindAssetReference(gameObject, handle, location, packageName: packageName);
} }
return gameObject as T; return gameObject as T;
} }
} }
T ret = handle.AssetObject as T; T ret = handle.AssetObject as T;
if (!needCache) if (!needCache)
{ {
handle.Dispose(); handle.Dispose();
} }
return ret; return ret;
} }
/// <summary> /// <inheritdoc />
/// 同步加载资源。 public T LoadAsset<T>(string location, out AssetOperationHandle handle, bool needCache = false,
/// </summary> string packageName = "") where T : Object
/// <param name="handle">资源操作句柄。</param>
/// <param name="location">资源的定位地址。</param>
/// <param name="needCache">是否需要缓存。</param>
/// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>资源实例。</returns>
public T LoadAsset<T>(string location, out AssetOperationHandle handle, bool needCache = false) where T : Object
{ {
handle = GetHandleSync<T>(location, needCache); handle = GetHandleSync<T>(location, needCache, packageName: packageName);
if (string.IsNullOrEmpty(location)) if (string.IsNullOrEmpty(location))
{ {
Log.Error("Asset name is invalid."); Log.Error("Asset name is invalid.");
@@ -605,31 +685,26 @@ namespace TEngine
GameObject gameObject = handle.InstantiateSync(); GameObject gameObject = handle.InstantiateSync();
if (!needCache) if (!needCache)
{ {
AssetReference.BindAssetReference(gameObject, handle, location); AssetReference.BindAssetReference(gameObject, handle, location, packageName: packageName);
} }
return gameObject as T; return gameObject as T;
} }
T ret = handle.AssetObject as T; T ret = handle.AssetObject as T;
if (!needCache) if (!needCache)
{ {
handle.Dispose(); handle.Dispose();
} }
return ret; return ret;
} }
/// <summary> /// <inheritdoc />
/// 同步加载资源。 public T LoadAsset<T>(string location, Transform parent, out AssetOperationHandle handle,
/// </summary> bool needCache = false, string packageName = "") where T : Object
/// <param name="location">资源的定位地址。</param>
/// <param name="handle">资源操作句柄。</param>
/// <param name="needCache">是否需要缓存。</param>
/// <param name="parent">父节点位置。</param>
/// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>资源实例。</returns>
public T LoadAsset<T>(string location, Transform parent, out AssetOperationHandle handle, bool needCache = false) where T : Object
{ {
handle = GetHandleSync<T>(location, needCache); handle = GetHandleSync<T>(location, needCache, packageName: packageName);
if (string.IsNullOrEmpty(location)) if (string.IsNullOrEmpty(location))
{ {
@@ -642,81 +717,78 @@ namespace TEngine
GameObject gameObject = handle.InstantiateSync(parent); GameObject gameObject = handle.InstantiateSync(parent);
if (!needCache) if (!needCache)
{ {
AssetReference.BindAssetReference(gameObject, handle, location); AssetReference.BindAssetReference(gameObject, handle, location, packageName: packageName);
} }
return gameObject as T; return gameObject as T;
} }
T ret = handle.AssetObject as T; T ret = handle.AssetObject as T;
if (!needCache) if (!needCache)
{ {
handle.Dispose(); handle.Dispose();
} }
return ret; return ret;
} }
/// <summary> /// <inheritdoc />
/// 同步加载资源并获取句柄。 public AssetOperationHandle LoadAssetGetOperation<T>(string location, bool needCache = false,
/// </summary> string packageName = "") where T : Object
/// <param name="location">资源的定位地址。</param>
/// <param name="needCache">是否需要缓存。</param>
/// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>同步加载资源句柄。</returns>
public AssetOperationHandle LoadAssetGetOperation<T>(string location, bool needCache = false) where T : Object
{ {
return GetHandleSync<T>(location, needCache); return GetHandleSync<T>(location, needCache, packageName: packageName);
} }
/// <summary> /// <inheritdoc />
/// 异步加载资源并获取句柄。 public AssetOperationHandle LoadAssetAsyncHandle<T>(string location, bool needCache = false,
/// </summary> string packageName = "") where T : Object
/// <param name="location">资源的定位地址。</param>
/// <param name="needCache">是否需要缓存。</param>
/// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>异步加载资源句柄。</returns>
public AssetOperationHandle LoadAssetAsyncHandle<T>(string location, bool needCache = false) where T : Object
{ {
return GetHandleAsync<T>(location, needCache); return GetHandleAsync<T>(location, needCache, packageName: packageName);
} }
/// <summary> /// <inheritdoc />
/// 同步加载子资源对象 public SubAssetsOperationHandle LoadSubAssetsSync<TObject>(string location, string packageName = "")
/// </summary> where TObject : Object
/// <typeparam name="TObject">资源类型。</typeparam>
/// <param name="location">资源的定位地址。</param>
public SubAssetsOperationHandle LoadSubAssetsSync<TObject>(string location) where TObject : Object
{ {
return YooAssets.LoadSubAssetsSync<TObject>(location: location); if (string.IsNullOrEmpty(packageName))
{
return YooAssets.LoadSubAssetsSync<TObject>(location: location);
}
var package = YooAssets.GetPackage(packageName);
return package.LoadSubAssetsSync<TObject>(location);
} }
/// <summary> /// <inheritdoc />
/// 异步加载子资源对象 public SubAssetsOperationHandle LoadSubAssetsAsync<TObject>(string location, string packageName = "")
/// </summary> where TObject : Object
/// <typeparam name="TObject">资源类型。</typeparam>
/// <param name="location">资源的定位地址。</param>
public SubAssetsOperationHandle LoadSubAssetsAsync<TObject>(string location) where TObject : Object
{ {
return YooAssets.LoadSubAssetsAsync<TObject>(location: location); if (string.IsNullOrEmpty(packageName))
{
return YooAssets.LoadSubAssetsAsync<TObject>(location: location);
}
var package = YooAssets.GetPackage(packageName);
return package.LoadSubAssetsAsync<TObject>(location: location);
} }
/// <summary> /// <inheritdoc />
/// 同步加载子资源对象 public SubAssetsOperationHandle LoadSubAssetsSync(AssetInfo assetInfo, string packageName = "")
/// </summary>
/// <param name="assetInfo">资源信息。</param>
public SubAssetsOperationHandle LoadSubAssetsSync(AssetInfo assetInfo)
{ {
return YooAssets.LoadSubAssetsSync(assetInfo); if (string.IsNullOrEmpty(packageName))
{
return YooAssets.LoadSubAssetsSync(assetInfo);
}
var package = YooAssets.GetPackage(packageName);
return package.LoadSubAssetsSync(assetInfo);
} }
/// <summary> /// <inheritdoc />
/// 通过Tag加载资源对象集合。 public async UniTask<List<T>> LoadAssetsByTagAsync<T>(string assetTag, string packageName = "")
/// </summary> where T : UnityEngine.Object
/// <param name="assetTag">资源标识。</param>
/// <typeparam name="T">资源类型。</typeparam>
/// <returns>资源对象集合。</returns>
public async UniTask<List<T>> LoadAssetsByTagAsync<T>(string assetTag) where T : UnityEngine.Object
{ {
LoadAssetsByTagOperation<T> operation = new LoadAssetsByTagOperation<T>(assetTag); LoadAssetsByTagOperation<T> operation = new LoadAssetsByTagOperation<T>(assetTag, packageName);
YooAssets.StartOperation(operation); YooAssets.StartOperation(operation);
await operation.ToUniTask(); await operation.ToUniTask();
List<T> assetObjects = operation.AssetObjects; List<T> assetObjects = operation.AssetObjects;
@@ -724,19 +796,14 @@ namespace TEngine
return assetObjects; return assetObjects;
} }
/// <summary> /// <inheritdoc />
/// 异步加载资源实例。 public async UniTask<T> LoadAssetAsync<T>(string location, CancellationToken cancellationToken = default,
/// </summary> bool needInstance = true, bool needCache = false, string packageName = "") where T : Object
/// <param name="location">要加载的实例名称。</param>
/// <param name="cancellationToken">取消操作Token。</param>
/// <param name="needInstance">是否需要实例化。</param>
/// <param name="needCache">是否需要缓存。</param>
/// <returns>资源实实例。</returns>
public async UniTask<T> LoadAssetAsync<T>(string location, CancellationToken cancellationToken = default, bool needInstance = true, bool needCache = false) where T : Object
{ {
AssetOperationHandle handle = LoadAssetAsyncHandle<T>(location, needCache); AssetOperationHandle handle = LoadAssetAsyncHandle<T>(location, needCache, packageName: packageName);
bool cancelOrFailed = await handle.ToUniTask().AttachExternalCancellation(cancellationToken).SuppressCancellationThrow(); bool cancelOrFailed = await handle.ToUniTask().AttachExternalCancellation(cancellationToken)
.SuppressCancellationThrow();
if (cancelOrFailed) if (cancelOrFailed)
{ {
@@ -750,32 +817,31 @@ namespace TEngine
GameObject gameObject = handle.InstantiateSync(); GameObject gameObject = handle.InstantiateSync();
if (!needCache) if (!needCache)
{ {
AssetReference.BindAssetReference(gameObject, handle, location); AssetReference.BindAssetReference(gameObject, handle, location, packageName: packageName);
} }
return gameObject as T; return gameObject as T;
} }
} }
T ret = handle.AssetObject as T; T ret = handle.AssetObject as T;
if (!needCache) if (!needCache)
{ {
handle.Dispose(); handle.Dispose();
} }
return ret; return ret;
} }
/// <summary> /// <inheritdoc />
/// 异步加载游戏物体。 public async UniTask<GameObject> LoadGameObjectAsync(string location,
/// </summary> CancellationToken cancellationToken = default, bool needCache = false, string packageName = "")
/// <param name="location">要加载的游戏物体名称。</param>
/// <param name="cancellationToken">取消操作Token。</param>
/// <param name="needCache">是否需要缓存。</param>
/// <returns>异步游戏物体实例。</returns>
public async UniTask<GameObject> LoadGameObjectAsync(string location, CancellationToken cancellationToken = default, bool needCache = false)
{ {
AssetOperationHandle handle = LoadAssetAsyncHandle<GameObject>(location, needCache); AssetOperationHandle handle =
LoadAssetAsyncHandle<GameObject>(location, needCache, packageName: packageName);
bool cancelOrFailed = await handle.ToUniTask().AttachExternalCancellation(cancellationToken).SuppressCancellationThrow(); bool cancelOrFailed = await handle.ToUniTask().AttachExternalCancellation(cancellationToken)
.SuppressCancellationThrow();
if (cancelOrFailed) if (cancelOrFailed)
{ {
@@ -785,22 +851,18 @@ namespace TEngine
GameObject gameObject = handle.InstantiateSync(); GameObject gameObject = handle.InstantiateSync();
if (!needCache) if (!needCache)
{ {
AssetReference.BindAssetReference(gameObject, handle, location); AssetReference.BindAssetReference(gameObject, handle, location, packageName: packageName);
} }
return gameObject; return gameObject;
} }
/// <summary> /// <inheritdoc />
/// 异步加载游戏物体。 public async UniTask<GameObject> LoadGameObjectAsync(string location, Transform parent,
/// </summary> CancellationToken cancellationToken = default, bool needCache = false, string packageName = "")
/// <param name="location">资源定位地址。</param>
/// <param name="parent">父节点位置。</param>
/// <param name="cancellationToken">取消操作Token。</param>
/// <param name="needCache">是否需要缓存。</param>
/// <returns>异步游戏物体实例。</returns>
public async UniTask<GameObject> LoadGameObjectAsync(string location, Transform parent, CancellationToken cancellationToken = default, bool needCache = false)
{ {
GameObject gameObject = await LoadGameObjectAsync(location, cancellationToken, needCache); GameObject gameObject =
await LoadGameObjectAsync(location, cancellationToken, needCache, packageName: packageName);
if (parent != null) if (parent != null)
{ {
gameObject.transform.SetParent(parent); gameObject.transform.SetParent(parent);
@@ -813,119 +875,137 @@ namespace TEngine
return gameObject; return gameObject;
} }
/// <summary> /// <inheritdoc />
/// 异步加载原生文件。 public async UniTask<RawFileOperationHandle> LoadRawAssetAsync(string location,
/// </summary> CancellationToken cancellationToken = default, string packageName = "")
/// <param name="location">资源定位地址。</param>
/// <param name="cancellationToken">取消操作Token。</param>
/// <returns>原生文件资源实例操作句柄。</returns>
/// <remarks>需要自行释放资源句柄(RawFileOperationHandle)。</remarks>
public async UniTask<RawFileOperationHandle> LoadRawAssetAsync(string location, CancellationToken cancellationToken = default)
{ {
RawFileOperationHandle handle = YooAssets.LoadRawFileAsync(location); RawFileOperationHandle handle;
if (string.IsNullOrEmpty(packageName))
{
handle = YooAssets.LoadRawFileAsync(location);
}
else
{
var package = YooAssets.GetPackage(packageName);
handle = package.LoadRawFileAsync(location);
}
bool cancelOrFailed = await handle.ToUniTask().AttachExternalCancellation(cancellationToken).SuppressCancellationThrow(); bool cancelOrFailed = await handle.ToUniTask().AttachExternalCancellation(cancellationToken)
.SuppressCancellationThrow();
return cancelOrFailed ? null : handle; return cancelOrFailed ? null : handle;
} }
/// <summary> /// <inheritdoc />
/// 异步加载子文件。 public async UniTask<T> LoadSubAssetAsync<T>(string location, string assetName,
/// </summary> CancellationToken cancellationToken = default, string packageName = "") where T : Object
/// <param name="location">资源定位地址。</param>
/// <param name="assetName">子资源名称。</param>
/// <param name="cancellationToken">取消操作Token。</param>
/// <typeparam name="T">资源实例类型。</typeparam>
/// <returns>原生文件资源实例。</returns>
public async UniTask<T> LoadSubAssetAsync<T>(string location, string assetName, CancellationToken cancellationToken = default) where T : Object
{ {
var assetInfo = GetAssetInfo(location); var assetInfo = GetAssetInfo(location, packageName: packageName);
if (assetInfo == null) if (assetInfo == null)
{ {
Log.Fatal($"AssetsInfo is null"); Log.Fatal($"AssetsInfo is null");
return null; return null;
} }
SubAssetsOperationHandle handle = YooAssets.LoadSubAssetsAsync(assetInfo); SubAssetsOperationHandle handle;
if (string.IsNullOrEmpty(packageName))
{
handle = YooAssets.LoadSubAssetsAsync(assetInfo);
}
else
{
var package = YooAssets.GetPackage(packageName);
handle = package.LoadSubAssetsAsync(assetInfo);
}
bool cancelOrFailed = await handle.ToUniTask().AttachExternalCancellation(cancellationToken).SuppressCancellationThrow(); bool cancelOrFailed = await handle.ToUniTask().AttachExternalCancellation(cancellationToken)
.SuppressCancellationThrow();
handle.Dispose(); handle.Dispose();
return cancelOrFailed ? null : handle.GetSubAssetObject<T>(assetName); return cancelOrFailed ? null : handle.GetSubAssetObject<T>(assetName);
} }
/// <summary> /// <inheritdoc />
/// 异步加载子文件。 public async UniTask<T[]> LoadAllSubAssetAsync<T>(string location,
/// </summary> CancellationToken cancellationToken = default, string packageName = "") where T : Object
/// <param name="location">资源定位地址。</param>
/// <param name="cancellationToken">取消操作Token。</param>
/// <typeparam name="T">资源实例类型。</typeparam>
/// <returns>原生文件资源实例。</returns>
public async UniTask<T[]> LoadAllSubAssetAsync<T>(string location, CancellationToken cancellationToken = default) where T : Object
{ {
var assetInfo = GetAssetInfo(location); var assetInfo = GetAssetInfo(location, packageName: packageName);
if (assetInfo == null) if (assetInfo == null)
{ {
Log.Fatal($"AssetsInfo is null"); Log.Fatal($"AssetsInfo is null");
return null; return null;
} }
SubAssetsOperationHandle handle = YooAssets.LoadSubAssetsAsync(assetInfo); SubAssetsOperationHandle handle;
if (string.IsNullOrEmpty(packageName))
{
handle = YooAssets.LoadSubAssetsAsync(assetInfo);
}
else
{
var package = YooAssets.GetPackage(packageName);
handle = package.LoadSubAssetsAsync(assetInfo);
}
bool cancelOrFailed = await handle.ToUniTask().AttachExternalCancellation(cancellationToken).SuppressCancellationThrow(); bool cancelOrFailed = await handle.ToUniTask().AttachExternalCancellation(cancellationToken)
.SuppressCancellationThrow();
handle.Dispose(); handle.Dispose();
return cancelOrFailed ? null : handle.GetSubAssetObjects<T>(); return cancelOrFailed ? null : handle.GetSubAssetObjects<T>();
} }
#region #region
private readonly Dictionary<string, Object> _preLoadMaps = new Dictionary<string, Object>(); private readonly Dictionary<string, Object> _preLoadMaps = new Dictionary<string, Object>();
/// <summary> /// <inheritdoc />
/// 放入预加载对象。 public void PushPreLoadAsset(string location, Object assetObject, string packageName = "")
/// </summary>
/// <param name="location">资源定位地址。</param>
/// <param name="assetObject">预加载对象。</param>
public void PushPreLoadAsset(string location, Object assetObject)
{ {
if (_preLoadMaps.ContainsKey(location)) var cacheKey = string.IsNullOrEmpty(packageName) || packageName.Equals(PackageName)
? location
: $"{packageName}/{location}";
if (_preLoadMaps.ContainsKey(cacheKey))
{ {
return; return;
} }
_preLoadMaps.Add(location, assetObject);
_preLoadMaps.Add(cacheKey, assetObject);
} }
/// <summary> /// <inheritdoc />
/// 获取预加载的实例对象。 public T GetPreLoadAsset<T>(string location, string packageName = "") where T : Object
/// </summary>
/// <param name="location">资源定位地址。</param>
/// <typeparam name="T">资源实例类型。</typeparam>
/// <returns>预加载对象。</returns>
public T GetPreLoadAsset<T>(string location) where T : Object
{ {
if (_preLoadMaps.TryGetValue(location,out Object assetObject)) var cacheKey = string.IsNullOrEmpty(packageName) || packageName.Equals(PackageName)
? location
: $"{packageName}/{location}";
if (_preLoadMaps.TryGetValue(cacheKey, out Object assetObject))
{ {
return assetObject as T; return assetObject as T;
} }
return default; return default;
} }
private void ReleasePreLoadAssets() private void ReleasePreLoadAssets(bool isShutDown = false)
{ {
using var iter = _preLoadMaps.GetEnumerator(); if (!isShutDown)
while (iter.MoveNext())
{ {
var assetObject = iter.Current.Value; using var iter = _preLoadMaps.GetEnumerator();
if (assetObject != null) while (iter.MoveNext())
{ {
UnityEngine.Object.Destroy(assetObject); var assetObject = iter.Current.Value;
if (assetObject != null)
{
Object.Destroy(assetObject);
}
} }
} }
_preLoadMaps.Clear(); _preLoadMaps.Clear();
} }
#endregion #endregion
} }
} }

View File

@@ -230,19 +230,23 @@ namespace TEngine
/// <summary> /// <summary>
/// 初始化操作。 /// 初始化操作。
/// </summary> /// </summary>
/// <param name="customPackageName">指定资源包的名称。不传使用默认资源包</param>
/// <returns></returns> /// <returns></returns>
public InitializationOperation InitPackage() public InitializationOperation InitPackage(string customPackageName = "")
{ {
return m_ResourceManager.InitPackage(); return m_ResourceManager.InitPackage(customPackageName);
} }
/// <summary> /// <summary>
/// 获取当前资源包版本。 /// 获取当前资源包版本。
/// </summary> /// </summary>
/// <param name="customPackageName">指定资源包的名称。不传使用默认资源包</param>
/// <returns>资源包版本。</returns> /// <returns>资源包版本。</returns>
public string GetPackageVersion() public string GetPackageVersion(string customPackageName = "")
{ {
var package = YooAssets.GetPackage(packageName); var package = string.IsNullOrEmpty(customPackageName)
? YooAssets.GetPackage(this.packageName)
: YooAssets.GetPackage(customPackageName);
if (package == null) if (package == null)
{ {
return string.Empty; return string.Empty;
@@ -256,10 +260,14 @@ namespace TEngine
/// </summary> /// </summary>
/// <param name="appendTimeTicks">请求URL是否需要带时间戳。</param> /// <param name="appendTimeTicks">请求URL是否需要带时间戳。</param>
/// <param name="timeout">超时时间。</param> /// <param name="timeout">超时时间。</param>
/// <param name="customPackageName">指定资源包的名称。不传使用默认资源包</param>
/// <returns>请求远端包裹的最新版本操作句柄。</returns> /// <returns>请求远端包裹的最新版本操作句柄。</returns>
public UpdatePackageVersionOperation UpdatePackageVersionAsync(bool appendTimeTicks = false, int timeout = 60) public UpdatePackageVersionOperation UpdatePackageVersionAsync(bool appendTimeTicks = false, int timeout = 60,
string customPackageName = "")
{ {
var package = YooAssets.GetPackage(packageName); var package = string.IsNullOrEmpty(customPackageName)
? YooAssets.GetPackage(this.packageName)
: YooAssets.GetPackage(customPackageName);
return package.UpdatePackageVersionAsync(appendTimeTicks, timeout); return package.UpdatePackageVersionAsync(appendTimeTicks, timeout);
} }
@@ -269,37 +277,78 @@ namespace TEngine
/// <param name="packageVersion">更新的包裹版本</param> /// <param name="packageVersion">更新的包裹版本</param>
/// <param name="autoSaveVersion">更新成功后自动保存版本号,作为下次初始化的版本。</param> /// <param name="autoSaveVersion">更新成功后自动保存版本号,作为下次初始化的版本。</param>
/// <param name="timeout">超时时间默认值60秒</param> /// <param name="timeout">超时时间默认值60秒</param>
public UpdatePackageManifestOperation UpdatePackageManifestAsync(string packageVersion, bool autoSaveVersion = true, int timeout = 60) /// <param name="customPackageName">指定资源包的名称。不传使用默认资源包</param>
public UpdatePackageManifestOperation UpdatePackageManifestAsync(string packageVersion,
bool autoSaveVersion = true, int timeout = 60, string customPackageName = "")
{ {
var package = YooAssets.GetPackage(packageName); var package = string.IsNullOrEmpty(customPackageName)
? YooAssets.GetPackage(this.packageName)
: YooAssets.GetPackage(customPackageName);
return package.UpdatePackageManifestAsync(packageVersion, autoSaveVersion, timeout); return package.UpdatePackageManifestAsync(packageVersion, autoSaveVersion, timeout);
} }
/// <summary> /// <summary>
/// 创建资源下载器,用于下载当前资源版本所有的资源包文件。 /// 创建资源下载器,用于下载当前资源版本所有的资源包文件。
/// </summary> /// </summary>
public ResourceDownloaderOperation CreateResourceDownloader() /// <param name="customPackageName">指定资源包的名称。不传使用默认资源包</param>
public ResourceDownloaderOperation CreateResourceDownloader(string customPackageName = "")
{ {
var package = YooAssets.GetPackage(packageName); if (string.IsNullOrEmpty(customPackageName))
Downloader = package.CreateResourceDownloader(downloadingMaxNum, failedTryAgain); {
return Downloader; var package = YooAssets.GetPackage(this.packageName);
Downloader = package.CreateResourceDownloader(downloadingMaxNum, failedTryAgain);
return Downloader;
}
else
{
var package = YooAssets.GetPackage(customPackageName);
Downloader = package.CreateResourceDownloader(downloadingMaxNum, failedTryAgain);
return Downloader;
}
}
/// <summary>
/// 创建资源下载器,用于下载当前资源版本指定地址的资源文件。
/// </summary>
/// <param name="location">资源地址</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
public ResourceDownloaderOperation CreateResourceDownloader(string location, string packageName = "")
{
if (string.IsNullOrEmpty(packageName))
{
var package = YooAssets.GetPackage(this.packageName);
Downloader = package.CreateResourceDownloader(location, downloadingMaxNum, failedTryAgain);
return Downloader;
}
else
{
var package = YooAssets.GetPackage(packageName);
Downloader = package.CreateResourceDownloader(location, downloadingMaxNum, failedTryAgain);
return Downloader;
}
} }
/// <summary> /// <summary>
/// 清理包裹未使用的缓存文件。 /// 清理包裹未使用的缓存文件。
/// </summary> /// </summary>
public ClearUnusedCacheFilesOperation ClearUnusedCacheFilesAsync() /// <param name="customPackageName">指定资源包的名称。不传使用默认资源包</param>
public ClearUnusedCacheFilesOperation ClearUnusedCacheFilesAsync(string customPackageName = "")
{ {
var package = YooAssets.GetPackage(packageName); var package = string.IsNullOrEmpty(customPackageName)
? YooAssets.GetPackage(this.packageName)
: YooAssets.GetPackage(customPackageName);
return package.ClearUnusedCacheFilesAsync(); return package.ClearUnusedCacheFilesAsync();
} }
/// <summary> /// <summary>
/// 清理沙盒路径。 /// 清理沙盒路径。
/// </summary> /// </summary>
public void ClearSandbox() /// <param name="customPackageName">指定资源包的名称。不传使用默认资源包</param>
public void ClearSandbox(string customPackageName = "")
{ {
var package = YooAssets.GetPackage(packageName); var package = string.IsNullOrEmpty(customPackageName)
? YooAssets.GetPackage(this.packageName)
: YooAssets.GetPackage(customPackageName);
package.ClearPackageSandbox(); package.ClearPackageSandbox();
} }
@@ -341,10 +390,11 @@ namespace TEngine
private void Update() private void Update()
{ {
m_LastUnloadUnusedAssetsOperationElapseSeconds += GameTime.unscaledDeltaTime; m_LastUnloadUnusedAssetsOperationElapseSeconds += GameTime.unscaledDeltaTime;
if (m_AsyncOperation == null && if (m_AsyncOperation == null &&
(m_ForceUnloadUnusedAssets || (m_ForceUnloadUnusedAssets ||
m_LastUnloadUnusedAssetsOperationElapseSeconds >= maxUnloadUnusedAssetsInterval || m_LastUnloadUnusedAssetsOperationElapseSeconds >= maxUnloadUnusedAssetsInterval ||
m_PreorderUnloadUnusedAssets && m_LastUnloadUnusedAssetsOperationElapseSeconds >= minUnloadUnusedAssetsInterval)) m_PreorderUnloadUnusedAssets &&
m_LastUnloadUnusedAssetsOperationElapseSeconds >= minUnloadUnusedAssetsInterval))
{ {
Log.Info("Unload unused assets..."); Log.Info("Unload unused assets...");
m_ForceUnloadUnusedAssets = false; m_ForceUnloadUnusedAssets = false;
@@ -370,10 +420,11 @@ namespace TEngine
/// 检查资源是否存在。 /// 检查资源是否存在。
/// </summary> /// </summary>
/// <param name="location">要检查资源的名称。</param> /// <param name="location">要检查资源的名称。</param>
/// <param name="customPackageName">指定资源包的名称。不传使用默认资源包</param>
/// <returns>检查资源是否存在的结果。</returns> /// <returns>检查资源是否存在的结果。</returns>
public HasAssetResult HasAsset(string location) public HasAssetResult HasAsset(string location, string customPackageName = "")
{ {
return m_ResourceManager.HasAsset(location); return m_ResourceManager.HasAsset(location, packageName: customPackageName);
} }
/// <summary> /// <summary>
@@ -389,59 +440,65 @@ namespace TEngine
/// 是否需要从远端更新下载。 /// 是否需要从远端更新下载。
/// </summary> /// </summary>
/// <param name="location">资源的定位地址。</param> /// <param name="location">资源的定位地址。</param>
/// <param name="customPackageName">指定资源包的名称。不传使用默认资源包</param>
/// <returns></returns> /// <returns></returns>
public bool IsNeedDownloadFromRemote(string location) public bool IsNeedDownloadFromRemote(string location, string customPackageName = "")
{ {
return m_ResourceManager.IsNeedDownloadFromRemote(location); return m_ResourceManager.IsNeedDownloadFromRemote(location, packageName: customPackageName);
} }
/// <summary> /// <summary>
/// 是否需要从远端更新下载。 /// 是否需要从远端更新下载。
/// </summary> /// </summary>
/// <param name="assetInfo">资源信息。</param> /// <param name="assetInfo">资源信息。</param>
/// <param name="customPackageName">指定资源包的名称。不传使用默认资源包</param>
/// <returns></returns> /// <returns></returns>
public bool IsNeedDownloadFromRemote(AssetInfo assetInfo) public bool IsNeedDownloadFromRemote(AssetInfo assetInfo, string customPackageName = "")
{ {
return m_ResourceManager.IsNeedDownloadFromRemote(assetInfo); return m_ResourceManager.IsNeedDownloadFromRemote(assetInfo, packageName: customPackageName);
} }
/// <summary> /// <summary>
/// 获取资源信息列表。 /// 获取资源信息列表。
/// </summary> /// </summary>
/// <param name="resTag">资源标签。</param> /// <param name="resTag">资源标签。</param>
/// <param name="customPackageName">指定资源包的名称。不传使用默认资源包</param>
/// <returns>资源信息列表。</returns> /// <returns>资源信息列表。</returns>
public AssetInfo[] GetAssetInfos(string resTag) public AssetInfo[] GetAssetInfos(string resTag, string customPackageName = "")
{ {
return m_ResourceManager.GetAssetInfos(resTag); return m_ResourceManager.GetAssetInfos(resTag, packageName: customPackageName);
} }
/// <summary> /// <summary>
/// 获取资源信息列表。 /// 获取资源信息列表。
/// </summary> /// </summary>
/// <param name="tags">资源标签列表。</param> /// <param name="tags">资源标签列表。</param>
/// <param name="customPackageName">指定资源包的名称。不传使用默认资源包</param>
/// <returns>资源信息列表。</returns> /// <returns>资源信息列表。</returns>
public AssetInfo[] GetAssetInfos(string[] tags) public AssetInfo[] GetAssetInfos(string[] tags, string customPackageName = "")
{ {
return m_ResourceManager.GetAssetInfos(tags); return m_ResourceManager.GetAssetInfos(tags, packageName: customPackageName);
} }
/// <summary> /// <summary>
/// 获取资源信息。 /// 获取资源信息。
/// </summary> /// </summary>
/// <param name="location">资源的定位地址。</param> /// <param name="location">资源的定位地址。</param>
/// <param name="customPackageName">指定资源包的名称。不传使用默认资源包</param>
/// <returns>资源信息。</returns> /// <returns>资源信息。</returns>
public AssetInfo GetAssetInfo(string location) public AssetInfo GetAssetInfo(string location, string customPackageName = "")
{ {
return m_ResourceManager.GetAssetInfo(location); return m_ResourceManager.GetAssetInfo(location, packageName: customPackageName);
} }
/// <summary> /// <summary>
/// 检查资源定位地址是否有效。 /// 检查资源定位地址是否有效。
/// </summary> /// </summary>
/// <param name="location">资源的定位地址</param> /// <param name="location">资源的定位地址</param>
public bool CheckLocationValid(string location) /// <param name="customPackageName">指定资源包的名称。不传使用默认资源包</param>
public bool CheckLocationValid(string location, string customPackageName = "")
{ {
return m_ResourceManager.CheckLocationValid(location); return m_ResourceManager.CheckLocationValid(location, packageName: customPackageName);
} }
/// <summary> /// <summary>
@@ -450,11 +507,13 @@ namespace TEngine
/// <param name="location">资源的定位地址。</param> /// <param name="location">资源的定位地址。</param>
/// <param name="needInstance">是否需要实例化。</param> /// <param name="needInstance">是否需要实例化。</param>
/// <param name="needCache">是否需要缓存。</param> /// <param name="needCache">是否需要缓存。</param>
/// <param name="customPackageName">指定资源包的名称。不传使用默认资源包</param>
/// <typeparam name="T">要加载资源的类型。</typeparam> /// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>资源实例。</returns> /// <returns>资源实例。</returns>
public T LoadAsset<T>(string location, bool needInstance = true, bool needCache = false) where T : UnityEngine.Object public T LoadAsset<T>(string location, bool needInstance = true, bool needCache = false,
string customPackageName = "") where T : UnityEngine.Object
{ {
return m_ResourceManager.LoadAsset<T>(location, needInstance, needCache); return m_ResourceManager.LoadAsset<T>(location, needInstance, needCache, packageName: customPackageName);
} }
/// <summary> /// <summary>
@@ -464,11 +523,14 @@ namespace TEngine
/// <param name="parent">父节点位置。</param> /// <param name="parent">父节点位置。</param>
/// <param name="needInstance">是否需要实例化。</param> /// <param name="needInstance">是否需要实例化。</param>
/// <param name="needCache">是否需要缓存。</param> /// <param name="needCache">是否需要缓存。</param>
/// <param name="customPackageName">指定资源包的名称。不传使用默认资源包</param>
/// <typeparam name="T">要加载资源的类型。</typeparam> /// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>资源实例。</returns> /// <returns>资源实例。</returns>
public T LoadAsset<T>(string location, Transform parent, bool needInstance = true, bool needCache = false) where T : UnityEngine.Object public T LoadAsset<T>(string location, Transform parent, bool needInstance = true, bool needCache = false,
string customPackageName = "") where T : UnityEngine.Object
{ {
return m_ResourceManager.LoadAsset<T>(location, parent, needInstance, needCache); return m_ResourceManager.LoadAsset<T>(location, parent, needInstance, needCache,
packageName: customPackageName);
} }
/// <summary> /// <summary>
@@ -477,11 +539,13 @@ namespace TEngine
/// <param name="handle">资源操作句柄。</param> /// <param name="handle">资源操作句柄。</param>
/// <param name="location">资源的定位地址。</param> /// <param name="location">资源的定位地址。</param>
/// <param name="needCache">是否需要缓存。</param> /// <param name="needCache">是否需要缓存。</param>
/// <param name="customPackageName">指定资源包的名称。不传使用默认资源包</param>
/// <typeparam name="T">要加载资源的类型。</typeparam> /// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>资源实例。</returns> /// <returns>资源实例。</returns>
public T LoadAsset<T>(string location, out AssetOperationHandle handle, bool needCache = false) where T : UnityEngine.Object public T LoadAsset<T>(string location, out AssetOperationHandle handle, bool needCache = false,
string customPackageName = "") where T : UnityEngine.Object
{ {
return m_ResourceManager.LoadAsset<T>(location, out handle, needCache); return m_ResourceManager.LoadAsset<T>(location, out handle, needCache, packageName: customPackageName);
} }
/// <summary> /// <summary>
@@ -491,11 +555,14 @@ namespace TEngine
/// <param name="handle">资源操作句柄。</param> /// <param name="handle">资源操作句柄。</param>
/// <param name="parent">父节点位置。</param> /// <param name="parent">父节点位置。</param>
/// <param name="needCache">是否需要缓存。</param> /// <param name="needCache">是否需要缓存。</param>
/// <param name="customPackageName">指定资源包的名称。不传使用默认资源包</param>
/// <typeparam name="T">要加载资源的类型。</typeparam> /// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>资源实例。</returns> /// <returns>资源实例。</returns>
public T LoadAsset<T>(string location, Transform parent, out AssetOperationHandle handle, bool needCache = false) where T : UnityEngine.Object public T LoadAsset<T>(string location, Transform parent, out AssetOperationHandle handle,
bool needCache = false, string customPackageName = "") where T : UnityEngine.Object
{ {
return m_ResourceManager.LoadAsset<T>(location, parent, out handle, needCache); return m_ResourceManager.LoadAsset<T>(location, parent, out handle, needCache,
packageName: customPackageName);
} }
/// <summary> /// <summary>
@@ -504,10 +571,13 @@ namespace TEngine
/// <param name="location">资源的定位地址。</param> /// <param name="location">资源的定位地址。</param>
/// <param name="callback">回调函数。</param> /// <param name="callback">回调函数。</param>
/// <param name="needCache">是否需要缓存。</param> /// <param name="needCache">是否需要缓存。</param>
/// <param name="customPackageName">指定资源包的名称。不传使用默认资源包</param>
/// <typeparam name="T">要加载资源的类型。</typeparam> /// <typeparam name="T">要加载资源的类型。</typeparam>
public void LoadAssetAsync<T>(string location, Action<AssetOperationHandle> callback = null, bool needCache = false) where T : UnityEngine.Object public void LoadAssetAsync<T>(string location, Action<AssetOperationHandle> callback = null,
bool needCache = false, string customPackageName = "") where T : UnityEngine.Object
{ {
AssetOperationHandle handle = m_ResourceManager.LoadAssetAsyncHandle<T>(location, needCache); AssetOperationHandle handle =
m_ResourceManager.LoadAssetAsyncHandle<T>(location, needCache, packageName: customPackageName);
handle.Completed += callback; handle.Completed += callback;
} }
@@ -517,11 +587,13 @@ namespace TEngine
/// </summary> /// </summary>
/// <param name="location">资源的定位地址。</param> /// <param name="location">资源的定位地址。</param>
/// <param name="needCache">是否需要缓存。</param> /// <param name="needCache">是否需要缓存。</param>
/// <param name="customPackageName">指定资源包的名称。不传使用默认资源包</param>
/// <typeparam name="T">要加载资源的类型。</typeparam> /// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>同步加载资源句柄。</returns> /// <returns>同步加载资源句柄。</returns>
public AssetOperationHandle LoadAssetGetOperation<T>(string location, bool needCache = false) where T : UnityEngine.Object public AssetOperationHandle LoadAssetGetOperation<T>(string location, bool needCache = false,
string customPackageName = "") where T : UnityEngine.Object
{ {
return m_ResourceManager.LoadAssetGetOperation<T>(location, needCache); return m_ResourceManager.LoadAssetGetOperation<T>(location, needCache, packageName: customPackageName);
} }
/// <summary> /// <summary>
@@ -529,11 +601,13 @@ namespace TEngine
/// </summary> /// </summary>
/// <param name="location">资源的定位地址。</param> /// <param name="location">资源的定位地址。</param>
/// <param name="needCache">是否需要缓存。</param> /// <param name="needCache">是否需要缓存。</param>
/// <param name="customPackageName">指定资源包的名称。不传使用默认资源包</param>
/// <typeparam name="T">要加载资源的类型。</typeparam> /// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>异步加载资源句柄。</returns> /// <returns>异步加载资源句柄。</returns>
public AssetOperationHandle LoadAssetAsyncHandle<T>(string location, bool needCache = false) where T : UnityEngine.Object public AssetOperationHandle LoadAssetAsyncHandle<T>(string location, bool needCache = false,
string customPackageName = "") where T : UnityEngine.Object
{ {
return m_ResourceManager.LoadAssetAsyncHandle<T>(location, needCache); return m_ResourceManager.LoadAssetAsyncHandle<T>(location, needCache, packageName: customPackageName);
} }
@@ -542,9 +616,11 @@ namespace TEngine
/// </summary> /// </summary>
/// <typeparam name="TObject">资源类型</typeparam> /// <typeparam name="TObject">资源类型</typeparam>
/// <param name="location">资源的定位地址</param> /// <param name="location">资源的定位地址</param>
public SubAssetsOperationHandle LoadSubAssetsSync<TObject>(string location) where TObject : UnityEngine.Object /// <param name="customPackageName">指定资源包的名称。不传使用默认资源包</param>
public SubAssetsOperationHandle LoadSubAssetsSync<TObject>(string location, string customPackageName = "")
where TObject : UnityEngine.Object
{ {
return m_ResourceManager.LoadSubAssetsSync<TObject>(location: location); return m_ResourceManager.LoadSubAssetsSync<TObject>(location: location, packageName: customPackageName);
} }
/// <summary> /// <summary>
@@ -552,36 +628,41 @@ namespace TEngine
/// </summary> /// </summary>
/// <typeparam name="TObject">资源类型</typeparam> /// <typeparam name="TObject">资源类型</typeparam>
/// <param name="location">资源的定位地址</param> /// <param name="location">资源的定位地址</param>
public SubAssetsOperationHandle LoadSubAssetsAsync<TObject>(string location) where TObject : UnityEngine.Object /// <param name="customPackageName">指定资源包的名称。不传使用默认资源包</param>
public SubAssetsOperationHandle LoadSubAssetsAsync<TObject>(string location, string customPackageName = "")
where TObject : UnityEngine.Object
{ {
return m_ResourceManager.LoadSubAssetsAsync<TObject>(location: location); return m_ResourceManager.LoadSubAssetsAsync<TObject>(location: location, packageName: customPackageName);
} }
/// <summary> /// <summary>
/// 同步加载子资源对象 /// 同步加载子资源对象
/// </summary> /// </summary>
/// <param name="location">资源的定位地址</param> /// <param name="location">资源的定位地址</param>
public SubAssetsOperationHandle LoadSubAssetsSync(string location) /// <param name="customPackageName">指定资源包的名称。不传使用默认资源包</param>
public SubAssetsOperationHandle LoadSubAssetsSync(string location, string customPackageName = "")
{ {
var assetInfo = GetAssetInfo(location); var assetInfo = GetAssetInfo(location, customPackageName: customPackageName);
if (assetInfo == null) if (assetInfo == null)
{ {
Log.Fatal($"AssetsInfo is null"); Log.Fatal($"AssetsInfo is null");
return null; return null;
} }
return m_ResourceManager.LoadSubAssetsSync(assetInfo); return m_ResourceManager.LoadSubAssetsSync(assetInfo, packageName: customPackageName);
} }
/// <summary> /// <summary>
/// 通过Tag加载资源对象集合。 /// 通过Tag加载资源对象集合。
/// </summary> /// </summary>
/// <param name="assetTag">资源标识。</param> /// <param name="assetTag">资源标识。</param>
/// <param name="customPackageName">指定资源包的名称。不传使用默认资源包</param>
/// <typeparam name="T">资源类型。</typeparam> /// <typeparam name="T">资源类型。</typeparam>
/// <returns>资源对象集合。</returns> /// <returns>资源对象集合。</returns>
public async UniTask<List<T>> LoadAssetsByTagAsync<T>(string assetTag) where T : UnityEngine.Object public async UniTask<List<T>> LoadAssetsByTagAsync<T>(string assetTag, string customPackageName = "")
where T : UnityEngine.Object
{ {
return await m_ResourceManager.LoadAssetsByTagAsync<T>(assetTag); return await m_ResourceManager.LoadAssetsByTagAsync<T>(assetTag, packageName: customPackageName);
} }
/// <summary> /// <summary>
@@ -591,11 +672,15 @@ namespace TEngine
/// <param name="cancellationToken">取消操作Token。</param> /// <param name="cancellationToken">取消操作Token。</param>
/// <param name="needInstance">是否需要实例化。</param> /// <param name="needInstance">是否需要实例化。</param>
/// <param name="needCache">是否需要缓存。</param> /// <param name="needCache">是否需要缓存。</param>
/// <param name="customPackageName">指定资源包的名称。不传使用默认资源包</param>
/// <typeparam name="T">要加载资源的类型。</typeparam> /// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>异步资源实例。</returns> /// <returns>异步资源实例。</returns>
public async UniTask<T> LoadAssetAsync<T>(string location, CancellationToken cancellationToken = default, bool needInstance = true, bool needCache = false) where T : UnityEngine.Object public async UniTask<T> LoadAssetAsync<T>(string location, CancellationToken cancellationToken = default,
bool needInstance = true, bool needCache = false, string customPackageName = "")
where T : UnityEngine.Object
{ {
return await m_ResourceManager.LoadAssetAsync<T>(location, cancellationToken, needInstance, needCache); return await m_ResourceManager.LoadAssetAsync<T>(location, cancellationToken, needInstance, needCache,
packageName: customPackageName);
} }
/// <summary> /// <summary>
@@ -604,10 +689,13 @@ namespace TEngine
/// <param name="location">要加载的游戏物体名称。</param> /// <param name="location">要加载的游戏物体名称。</param>
/// <param name="cancellationToken">取消操作Token。</param> /// <param name="cancellationToken">取消操作Token。</param>
/// <param name="needCache">是否需要缓存。</param> /// <param name="needCache">是否需要缓存。</param>
/// <param name="customPackageName">指定资源包的名称。不传使用默认资源包</param>
/// <returns>异步游戏物体实例。</returns> /// <returns>异步游戏物体实例。</returns>
public async UniTask<GameObject> LoadGameObjectAsync(string location, CancellationToken cancellationToken = default, bool needCache = false) public async UniTask<GameObject> LoadGameObjectAsync(string location,
CancellationToken cancellationToken = default, bool needCache = false, string customPackageName = "")
{ {
return await m_ResourceManager.LoadGameObjectAsync(location, cancellationToken, needCache); return await m_ResourceManager.LoadGameObjectAsync(location, cancellationToken, needCache,
packageName: customPackageName);
} }
/// <summary> /// <summary>
@@ -617,10 +705,13 @@ namespace TEngine
/// <param name="parent">父节点位置。</param> /// <param name="parent">父节点位置。</param>
/// <param name="cancellationToken">取消操作Token。</param> /// <param name="cancellationToken">取消操作Token。</param>
/// <param name="needCache">是否需要缓存。</param> /// <param name="needCache">是否需要缓存。</param>
/// <param name="customPackageName">指定资源包的名称。不传使用默认资源包</param>
/// <returns>异步游戏物体实例。</returns> /// <returns>异步游戏物体实例。</returns>
public async UniTask<GameObject> LoadGameObjectAsync(string location, Transform parent, CancellationToken cancellationToken = default, bool needCache = false) public async UniTask<GameObject> LoadGameObjectAsync(string location, Transform parent,
CancellationToken cancellationToken = default, bool needCache = false, string customPackageName = "")
{ {
return await m_ResourceManager.LoadGameObjectAsync(location, parent, cancellationToken, needCache); return await m_ResourceManager.LoadGameObjectAsync(location, parent, cancellationToken, needCache,
packageName: customPackageName);
} }
/// <summary> /// <summary>
@@ -628,10 +719,13 @@ namespace TEngine
/// </summary> /// </summary>
/// <param name="location">资源定位地址。</param> /// <param name="location">资源定位地址。</param>
/// <param name="cancellationToken">取消操作Token。</param> /// <param name="cancellationToken">取消操作Token。</param>
/// <param name="customPackageName">指定资源包的名称。不传使用默认资源包</param>
/// <returns>原生文件资源实例。</returns> /// <returns>原生文件资源实例。</returns>
public async UniTask<RawFileOperationHandle> LoadRawAssetAsync(string location, CancellationToken cancellationToken = default) public async UniTask<RawFileOperationHandle> LoadRawAssetAsync(string location,
CancellationToken cancellationToken = default, string customPackageName = "")
{ {
return await m_ResourceManager.LoadRawAssetAsync(location, cancellationToken); return await m_ResourceManager.LoadRawAssetAsync(location, cancellationToken,
packageName: customPackageName);
} }
/// <summary> /// <summary>
@@ -640,11 +734,14 @@ namespace TEngine
/// <param name="location">资源定位地址。</param> /// <param name="location">资源定位地址。</param>
/// <param name="assetName">子资源名称。</param> /// <param name="assetName">子资源名称。</param>
/// <param name="cancellationToken">取消操作Token。</param> /// <param name="cancellationToken">取消操作Token。</param>
/// <param name="customPackageName">指定资源包的名称。不传使用默认资源包</param>
/// <typeparam name="T">资源实例类型。</typeparam> /// <typeparam name="T">资源实例类型。</typeparam>
/// <returns>原生文件资源实例。</returns> /// <returns>原生文件资源实例。</returns>
public async UniTask<T> LoadSubAssetAsync<T>(string location, string assetName, CancellationToken cancellationToken = default) where T : UnityEngine.Object public async UniTask<T> LoadSubAssetAsync<T>(string location, string assetName,
CancellationToken cancellationToken = default, string customPackageName = "") where T : UnityEngine.Object
{ {
return await m_ResourceManager.LoadSubAssetAsync<T>(location, assetName, cancellationToken); return await m_ResourceManager.LoadSubAssetAsync<T>(location, assetName, cancellationToken,
packageName: customPackageName);
} }
/// <summary> /// <summary>
@@ -652,34 +749,41 @@ namespace TEngine
/// </summary> /// </summary>
/// <param name="location">资源定位地址。</param> /// <param name="location">资源定位地址。</param>
/// <param name="cancellationToken">取消操作Token。</param> /// <param name="cancellationToken">取消操作Token。</param>
/// <param name="customPackageName">指定资源包的名称。不传使用默认资源包</param>
/// <typeparam name="T">资源实例类型。</typeparam> /// <typeparam name="T">资源实例类型。</typeparam>
/// <returns>原生文件资源实例。</returns> /// <returns>原生文件资源实例。</returns>
public async UniTask<T[]> LoadAllSubAssetAsync<T>(string location, CancellationToken cancellationToken = default) where T : UnityEngine.Object public async UniTask<T[]> LoadAllSubAssetAsync<T>(string location,
CancellationToken cancellationToken = default, string customPackageName = "") where T : UnityEngine.Object
{ {
return await m_ResourceManager.LoadAllSubAssetAsync<T>(location, cancellationToken); return await m_ResourceManager.LoadAllSubAssetAsync<T>(location, cancellationToken,
packageName: customPackageName);
} }
#region #region
/// <summary> /// <summary>
/// 放入预加载对象。 /// 放入预加载对象。
/// </summary> /// </summary>
/// <param name="location">资源定位地址。</param> /// <param name="location">资源定位地址。</param>
/// <param name="assetObject">预加载对象。</param> /// <param name="assetObject">预加载对象。</param>
public void PushPreLoadAsset(string location, UnityEngine.Object assetObject) /// <param name="customPackageName">指定资源包的名称。不传使用默认资源包</param>
public void PushPreLoadAsset(string location, UnityEngine.Object assetObject, string customPackageName = "")
{ {
m_ResourceManager.PushPreLoadAsset(location, assetObject); m_ResourceManager.PushPreLoadAsset(location, assetObject, packageName: customPackageName);
} }
/// <summary> /// <summary>
/// 获取预加载的实例对象。 /// 获取预加载的实例对象。
/// </summary> /// </summary>
/// <param name="location">资源定位地址。</param> /// <param name="location">资源定位地址。</param>
/// <param name="customPackageName">指定资源包的名称。不传使用默认资源包</param>
/// <typeparam name="T">资源实例类型。</typeparam> /// <typeparam name="T">资源实例类型。</typeparam>
/// <returns>预加载对象。</returns> /// <returns>预加载对象。</returns>
public T GetPreLoadAsset<T>(string location) where T : UnityEngine.Object public T GetPreLoadAsset<T>(string location, string customPackageName = "") where T : UnityEngine.Object
{ {
return m_ResourceManager.GetPreLoadAsset<T>(location); return m_ResourceManager.GetPreLoadAsset<T>(location, packageName: customPackageName);
} }
#endregion #endregion
} }
} }

View File

@@ -340,7 +340,7 @@ namespace TEngine
public async UniTask<T> CreateWidgetByPathAsync<T>(Transform parentTrans, string assetLocation, bool visible = true) where T : UIWidget, new() public async UniTask<T> CreateWidgetByPathAsync<T>(Transform parentTrans, string assetLocation, bool visible = true) where T : UIWidget, new()
{ {
GameObject goInst = await GameModule.Resource.LoadAssetAsync<GameObject>(assetLocation, gameObject.GetCancellationTokenOnDestroy()); GameObject goInst = await GameModule.Resource.LoadAssetAsync<GameObject>(assetLocation, gameObject.GetCancellationTokenOnDestroy());
goInst.transform.SetParent(parentTrans); goInst.transform.SetParent(parentTrans, false);
return CreateWidget<T>(goInst, visible); return CreateWidget<T>(goInst, visible);
} }