diff --git a/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/AssetGroup.cs b/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/AssetGroup.cs index 638c7c5d..09030a28 100644 --- a/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/AssetGroup.cs +++ b/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/AssetGroup.cs @@ -22,7 +22,8 @@ namespace TEngine public AssetOperationHandle Handle => _handle; /// - /// 标签。 + /// 自定义资源标签。 + /// 不同于AssetTag。 /// public string Tag { private set; get; } @@ -78,7 +79,8 @@ namespace TEngine public class AssetGroup : IMemory { private readonly Dictionary _assetHandleDataMap = new Dictionary(); - + + #region 引用资源数据 /// /// 引用资源数据到资源组内。 /// @@ -105,32 +107,38 @@ namespace TEngine _assetHandleDataMap[address] = handleData; return true; } + #endregion + + #region 释放资源数据 + private readonly List _tempResult = new List(); /// /// 从资源组内释放资源数据。 /// - /// 资源标签。 + /// 自定义资源标签。 /// 是否释放成功。 - public bool ReleaseByTag(string assetTag) + public bool ReleaseByTag(string tag) { - AssetHandleData founded = null; + _tempResult.Clear(); foreach (var assetHandleData in _assetHandleDataMap.Values) { - if (assetHandleData.Tag == assetTag) + if (assetHandleData.Tag == tag) { - founded = assetHandleData; - break; + _tempResult.Add(assetHandleData); } } - if (founded != null) + if (_tempResult.Count > 0) { - _assetHandleDataMap.Remove(founded.Handle.GetAssetInfo().Address); - AssetHandleData.Release(founded); + foreach (var founded in _tempResult) + { + _assetHandleDataMap.Remove(founded.Handle.GetAssetInfo().Address); + AssetHandleData.Release(founded); + } return true; } - Log.Warning($"Release AssetHandleData Tag:{assetTag} Failed"); + Log.Warning($"Release AssetHandleData Tag:{tag} Failed"); return false; } @@ -178,20 +186,9 @@ namespace TEngine Log.Warning($"Release AssetHandleData Handle:{handle} Failed"); return false; } + #endregion - public void Clear() - { - var etr = _assetHandleDataMap.GetEnumerator(); - while (etr.MoveNext()) - { - AssetHandleData assetHandleData = etr.Current.Value; - AssetHandleData.Release(assetHandleData); - } - - etr.Dispose(); - _assetHandleDataMap.Clear(); - } - + #region 内存池接口 /// /// 从内存池中获取资源分组数据。 /// @@ -216,25 +213,41 @@ namespace TEngine MemoryPool.Release(assetGroup); } + + public void Clear() + { + var etr = _assetHandleDataMap.GetEnumerator(); + while (etr.MoveNext()) + { + AssetHandleData assetHandleData = etr.Current.Value; + AssetHandleData.Release(assetHandleData); + } + + etr.Dispose(); + _assetHandleDataMap.Clear(); + } + #endregion /// /// 同步加载资源。 /// - /// 要加载资源的名称。 + /// 资源的定位地址。 /// 父节点位置。 + /// 是否需要实例化。 + /// 指定资源包的名称。不传使用默认资源包 /// 要加载资源的类型。 /// 资源实例。 - public T LoadAsset(string assetName, Transform parent = null) where T : Object + public T LoadAsset(string location, bool needInstance = true,string packageName = "",Transform parent = null) where T : Object { - if (string.IsNullOrEmpty(assetName)) + if (string.IsNullOrEmpty(location)) { Log.Error("Asset name is invalid."); return default; } - if (_assetHandleDataMap.TryGetValue(assetName,out var assetHandleData)) + if (_assetHandleDataMap.TryGetValue(location,out var assetHandleData)) { - if (typeof(T) == typeof(GameObject)) + if (typeof(T) == typeof(GameObject) && needInstance) { GameObject ret = assetHandleData.Handle.InstantiateSync(parent); return ret as T; @@ -245,11 +258,20 @@ namespace TEngine } } - AssetOperationHandle handle = YooAssets.LoadAssetSync(assetName); + AssetOperationHandle handle; + if (string.IsNullOrEmpty(packageName)) + { + handle = YooAssets.LoadAssetSync(location); + } + else + { + var package = YooAssets.GetPackage(packageName); + handle = package.LoadAssetSync(location); + } Reference(handle); - if (typeof(T) == typeof(GameObject)) + if (typeof(T) == typeof(GameObject) && needInstance) { GameObject ret = handle.InstantiateSync(parent); return ret as T; @@ -259,115 +281,29 @@ namespace TEngine return handle.AssetObject as T; } } - + /// - /// 同步加载资源。 + /// 异步加载资源。 /// - /// 要加载资源的名称。 - /// 要加载资源的类型。 - /// 资源操作句柄。 - /// 资源实例。 - public T LoadAsset(string assetName,out AssetOperationHandle assetOperationHandle) where T : Object - { - assetOperationHandle = null; - if (string.IsNullOrEmpty(assetName)) - { - Log.Error("Asset name is invalid."); - return default; - } - - if (_assetHandleDataMap.TryGetValue(assetName,out var assetHandleData)) - { - if (typeof(T) == typeof(GameObject)) - { - GameObject ret = assetHandleData.Handle.InstantiateSync(); - return ret as T; - } - else - { - return assetHandleData.Handle.AssetObject as T; - } - } - - assetOperationHandle = YooAssets.LoadAssetSync(assetName); - - Reference(assetOperationHandle); - - if (typeof(T) == typeof(GameObject)) - { - GameObject ret = assetOperationHandle.InstantiateSync(); - return ret as T; - } - else - { - return assetOperationHandle.AssetObject as T; - } - } - - /// - /// 同步加载资源。 - /// - /// 要加载资源的名称。 - /// 父节点位置。 - /// 资源操作句柄。 - /// 要加载资源的类型。 - /// 资源实例。 - public T LoadAsset(string assetName, Transform parent,out AssetOperationHandle assetOperationHandle) where T : Object - { - assetOperationHandle = null; - if (string.IsNullOrEmpty(assetName)) - { - Log.Error("Asset name is invalid."); - return default; - } - - if (_assetHandleDataMap.TryGetValue(assetName,out var assetHandleData)) - { - if (typeof(T) == typeof(GameObject)) - { - GameObject ret = assetHandleData.Handle.InstantiateSync(parent); - return ret as T; - } - else - { - return assetHandleData.Handle.AssetObject as T; - } - } - - assetOperationHandle = YooAssets.LoadAssetSync(assetName); - - Reference(assetOperationHandle); - - if (typeof(T) == typeof(GameObject)) - { - GameObject ret = assetOperationHandle.InstantiateSync(parent); - return ret as T; - } - else - { - return assetOperationHandle.AssetObject as T; - } - } - - /// - /// 异步加载资源实例。 - /// - /// 要加载的实例名称。 + /// 资源的定位地址。 /// 取消操作Token。 - /// 资源实实例。 - // ReSharper disable once UnusedParameter.Global - // ReSharper disable once RedundantAssignment - public async UniTask LoadAssetAsync(string assetName, CancellationToken cancellationToken = default) where T : Object + /// 是否需要实例化。 + /// 指定资源包的名称。不传使用默认资源包。 + /// 资源实例父节点。 + /// 要加载资源的类型。 + /// 异步资源实例。 + public async UniTask LoadAssetAsync(string location, CancellationToken cancellationToken = default, + bool needInstance = true, string packageName = "", Transform parent = null) where T : Object { - if (string.IsNullOrEmpty(assetName)) + if (string.IsNullOrEmpty(location)) { Log.Error("Asset name is invalid."); return default; } - if (_assetHandleDataMap.TryGetValue(assetName,out var assetHandleData)) + if (_assetHandleDataMap.TryGetValue(location,out var assetHandleData)) { - if (typeof(T) == typeof(GameObject)) + if (typeof(T) == typeof(GameObject) && needInstance) { GameObject ret = assetHandleData.Handle.InstantiateSync(); return ret as T; @@ -378,7 +314,16 @@ namespace TEngine } } - AssetOperationHandle handle = YooAssets.LoadAssetAsync(assetName); + AssetOperationHandle handle; + if (string.IsNullOrEmpty(packageName)) + { + handle = YooAssets.LoadAssetSync(location); + } + else + { + var package = YooAssets.GetPackage(packageName); + handle = package.LoadAssetSync(location); + } Reference(handle); @@ -391,9 +336,9 @@ namespace TEngine return null; } - if (typeof(T) == typeof(GameObject)) + if (typeof(T) == typeof(GameObject) && needInstance) { - GameObject ret = handle.InstantiateSync(); + GameObject ret = handle.InstantiateSync(parent); return ret as T; } else @@ -401,16 +346,5 @@ namespace TEngine return handle.AssetObject as T; } } - - /// - /// 异步加载游戏物体。 - /// - /// 要加载的游戏物体名称。 - /// 取消操作Token。 - /// 异步游戏物体实例。 - public async UniTask LoadGameObjectAsync(string assetName, CancellationToken cancellationToken = default) - { - return await LoadAssetAsync(assetName,cancellationToken); - } } } \ No newline at end of file diff --git a/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/AssetReference.cs b/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/AssetReference.cs index b4337c1c..64d938c7 100644 --- a/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/AssetReference.cs +++ b/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/AssetReference.cs @@ -153,82 +153,49 @@ namespace TEngine /// /// 同步加载资源。 /// - /// 要加载资源的名称。 - /// 要加载资源的类型。 - /// 资源实例。 - public T LoadAsset(string assetName) where T : Object - { - DirtyInitAssetGroup(); - return _assetGroup.LoadAsset(assetName); - } - - /// - /// 同步加载资源。 - /// - /// 要加载资源的名称。 + /// 资源的定位地址。 /// 父节点位置。 + /// 是否需要实例化。 + /// 指定资源包的名称。不传使用默认资源包 /// 要加载资源的类型。 /// 资源实例。 - public T LoadAsset(string assetName, Transform parent) where T : Object + public T LoadAsset(string location, bool needInstance = true,string packageName = "",Transform parent = null) where T : Object { DirtyInitAssetGroup(); - return _assetGroup.LoadAsset(assetName, parent); + return _assetGroup.LoadAsset(location, needInstance, packageName, parent); } /// - /// 同步加载资源。 + /// 异步加载资源。 /// - /// 要加载资源的名称。 - /// 要加载资源的类型。 - /// 资源操作句柄。 - /// 资源实例。 - // ReSharper disable once ParameterHidesMember - public T LoadAsset(string assetName, out AssetOperationHandle assetOperationHandle) where T : Object - { - DirtyInitAssetGroup(); - return _assetGroup.LoadAsset(assetName, out assetOperationHandle); - } - - /// - /// 同步加载资源。 - /// - /// 要加载资源的名称。 - /// 父节点位置。 - /// 要加载资源的类型。 - /// 资源操作句柄。 - /// 资源实例。 - // ReSharper disable once ParameterHidesMember - public T LoadAsset(string assetName, Transform parent, out AssetOperationHandle assetOperationHandle) - where T : Object - { - DirtyInitAssetGroup(); - return _assetGroup.LoadAsset(assetName, parent, out assetOperationHandle); - } - - /// - /// 异步加载资源实例。 - /// - /// 要加载的实例名称。 + /// 资源的定位地址。 /// 取消操作Token。 - /// 资源实实例。 - public async UniTask LoadAssetAsync(string assetName, CancellationToken cancellationToken = default) - where T : Object + /// 是否需要实例化。 + /// 指定资源包的名称。不传使用默认资源包。 + /// 资源实例父节点。 + /// 要加载资源的类型。 + /// 异步资源实例。 + public async UniTask LoadAssetAsync(string location, CancellationToken cancellationToken = default, + bool needInstance = true, string packageName = "", Transform parent = null) where T : Object { DirtyInitAssetGroup(); - return await _assetGroup.LoadAssetAsync(assetName, cancellationToken); + return await _assetGroup.LoadAssetAsync(location, cancellationToken, needInstance, packageName, parent); } /// /// 异步加载游戏物体。 /// - /// 要加载的游戏物体名称。 + /// 资源的定位地址。 /// 取消操作Token。 - /// 异步游戏物体实例。 - public async UniTask LoadGameObjectAsync(string assetName, - CancellationToken cancellationToken = default) + /// 是否需要实例化。 + /// 指定资源包的名称。不传使用默认资源包。 + /// 资源实例父节点。 + /// 异步资源实例。 + public async UniTask LoadGameObjectAsync(string location, CancellationToken cancellationToken = default, + bool needInstance = true, string packageName = "", Transform parent = null) { DirtyInitAssetGroup(); - return await _assetGroup.LoadGameObjectAsync(assetName, cancellationToken); + return await LoadAssetAsync(location, cancellationToken, needInstance, packageName, parent); } ///