mirror of
https://github.com/Alex-Rachel/TEngine.git
synced 2025-08-07 16:45:10 +00:00
优化资源引用类与资源分组类。
This commit is contained in:
@@ -22,7 +22,8 @@ namespace TEngine
|
||||
public AssetOperationHandle Handle => _handle;
|
||||
|
||||
/// <summary>
|
||||
/// 标签。
|
||||
/// 自定义资源标签。
|
||||
/// <remarks>不同于AssetTag。</remarks>
|
||||
/// </summary>
|
||||
public string Tag { private set; get; }
|
||||
|
||||
@@ -79,6 +80,7 @@ namespace TEngine
|
||||
{
|
||||
private readonly Dictionary<string,AssetHandleData> _assetHandleDataMap = new Dictionary<string,AssetHandleData>();
|
||||
|
||||
#region 引用资源数据
|
||||
/// <summary>
|
||||
/// 引用资源数据到资源组内。
|
||||
/// </summary>
|
||||
@@ -105,32 +107,38 @@ namespace TEngine
|
||||
_assetHandleDataMap[address] = handleData;
|
||||
return true;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 释放资源数据
|
||||
private readonly List<AssetHandleData> _tempResult = new List<AssetHandleData>();
|
||||
|
||||
/// <summary>
|
||||
/// 从资源组内释放资源数据。
|
||||
/// </summary>
|
||||
/// <param name="assetTag">资源标签。</param>
|
||||
/// <param name="tag">自定义资源标签。</param>
|
||||
/// <returns>是否释放成功。</returns>
|
||||
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)
|
||||
{
|
||||
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 内存池接口
|
||||
/// <summary>
|
||||
/// 从内存池中获取资源分组数据。
|
||||
/// </summary>
|
||||
@@ -217,24 +214,40 @@ 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
|
||||
|
||||
/// <summary>
|
||||
/// 同步加载资源。
|
||||
/// </summary>
|
||||
/// <param name="assetName">要加载资源的名称。</param>
|
||||
/// <param name="location">资源的定位地址。</param>
|
||||
/// <param name="parent">父节点位置。</param>
|
||||
/// <param name="needInstance">是否需要实例化。</param>
|
||||
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
|
||||
/// <typeparam name="T">要加载资源的类型。</typeparam>
|
||||
/// <returns>资源实例。</returns>
|
||||
public T LoadAsset<T>(string assetName, Transform parent = null) where T : Object
|
||||
public T LoadAsset<T>(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<T>(assetName);
|
||||
AssetOperationHandle handle;
|
||||
if (string.IsNullOrEmpty(packageName))
|
||||
{
|
||||
handle = YooAssets.LoadAssetSync<T>(location);
|
||||
}
|
||||
else
|
||||
{
|
||||
var package = YooAssets.GetPackage(packageName);
|
||||
handle = package.LoadAssetSync<T>(location);
|
||||
}
|
||||
|
||||
Reference(handle);
|
||||
|
||||
if (typeof(T) == typeof(GameObject))
|
||||
if (typeof(T) == typeof(GameObject) && needInstance)
|
||||
{
|
||||
GameObject ret = handle.InstantiateSync(parent);
|
||||
return ret as T;
|
||||
@@ -261,113 +283,27 @@ namespace TEngine
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 同步加载资源。
|
||||
/// 异步加载资源。
|
||||
/// </summary>
|
||||
/// <param name="assetName">要加载资源的名称。</param>
|
||||
/// <typeparam name="T">要加载资源的类型。</typeparam>
|
||||
/// <param name="assetOperationHandle">资源操作句柄。</param>
|
||||
/// <returns>资源实例。</returns>
|
||||
public T LoadAsset<T>(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<T>(assetName);
|
||||
|
||||
Reference(assetOperationHandle);
|
||||
|
||||
if (typeof(T) == typeof(GameObject))
|
||||
{
|
||||
GameObject ret = assetOperationHandle.InstantiateSync();
|
||||
return ret as T;
|
||||
}
|
||||
else
|
||||
{
|
||||
return assetOperationHandle.AssetObject as T;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 同步加载资源。
|
||||
/// </summary>
|
||||
/// <param name="assetName">要加载资源的名称。</param>
|
||||
/// <param name="parent">父节点位置。</param>
|
||||
/// <param name="assetOperationHandle">资源操作句柄。</param>
|
||||
/// <typeparam name="T">要加载资源的类型。</typeparam>
|
||||
/// <returns>资源实例。</returns>
|
||||
public T LoadAsset<T>(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<T>(assetName);
|
||||
|
||||
Reference(assetOperationHandle);
|
||||
|
||||
if (typeof(T) == typeof(GameObject))
|
||||
{
|
||||
GameObject ret = assetOperationHandle.InstantiateSync(parent);
|
||||
return ret as T;
|
||||
}
|
||||
else
|
||||
{
|
||||
return assetOperationHandle.AssetObject as T;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 异步加载资源实例。
|
||||
/// </summary>
|
||||
/// <param name="assetName">要加载的实例名称。</param>
|
||||
/// <param name="location">资源的定位地址。</param>
|
||||
/// <param name="cancellationToken">取消操作Token。</param>
|
||||
/// <returns>资源实实例。</returns>
|
||||
// ReSharper disable once UnusedParameter.Global
|
||||
// ReSharper disable once RedundantAssignment
|
||||
public async UniTask<T> LoadAssetAsync<T>(string assetName, CancellationToken cancellationToken = default) where T : Object
|
||||
/// <param name="needInstance">是否需要实例化。</param>
|
||||
/// <param name="packageName">指定资源包的名称。不传使用默认资源包。</param>
|
||||
/// <param name="parent">资源实例父节点。</param>
|
||||
/// <typeparam name="T">要加载资源的类型。</typeparam>
|
||||
/// <returns>异步资源实例。</returns>
|
||||
public async UniTask<T> LoadAssetAsync<T>(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<T>(assetName);
|
||||
AssetOperationHandle handle;
|
||||
if (string.IsNullOrEmpty(packageName))
|
||||
{
|
||||
handle = YooAssets.LoadAssetSync<T>(location);
|
||||
}
|
||||
else
|
||||
{
|
||||
var package = YooAssets.GetPackage(packageName);
|
||||
handle = package.LoadAssetSync<T>(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;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 异步加载游戏物体。
|
||||
/// </summary>
|
||||
/// <param name="assetName">要加载的游戏物体名称。</param>
|
||||
/// <param name="cancellationToken">取消操作Token。</param>
|
||||
/// <returns>异步游戏物体实例。</returns>
|
||||
public async UniTask<GameObject> LoadGameObjectAsync(string assetName, CancellationToken cancellationToken = default)
|
||||
{
|
||||
return await LoadAssetAsync<GameObject>(assetName,cancellationToken);
|
||||
}
|
||||
}
|
||||
}
|
@@ -153,82 +153,49 @@ namespace TEngine
|
||||
/// <summary>
|
||||
/// 同步加载资源。
|
||||
/// </summary>
|
||||
/// <param name="assetName">要加载资源的名称。</param>
|
||||
/// <typeparam name="T">要加载资源的类型。</typeparam>
|
||||
/// <returns>资源实例。</returns>
|
||||
public T LoadAsset<T>(string assetName) where T : Object
|
||||
{
|
||||
DirtyInitAssetGroup();
|
||||
return _assetGroup.LoadAsset<T>(assetName);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 同步加载资源。
|
||||
/// </summary>
|
||||
/// <param name="assetName">要加载资源的名称。</param>
|
||||
/// <param name="location">资源的定位地址。</param>
|
||||
/// <param name="parent">父节点位置。</param>
|
||||
/// <param name="needInstance">是否需要实例化。</param>
|
||||
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
|
||||
/// <typeparam name="T">要加载资源的类型。</typeparam>
|
||||
/// <returns>资源实例。</returns>
|
||||
public T LoadAsset<T>(string assetName, Transform parent) where T : Object
|
||||
public T LoadAsset<T>(string location, bool needInstance = true,string packageName = "",Transform parent = null) where T : Object
|
||||
{
|
||||
DirtyInitAssetGroup();
|
||||
return _assetGroup.LoadAsset<T>(assetName, parent);
|
||||
return _assetGroup.LoadAsset<T>(location, needInstance, packageName, parent);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 同步加载资源。
|
||||
/// 异步加载资源。
|
||||
/// </summary>
|
||||
/// <param name="assetName">要加载资源的名称。</param>
|
||||
/// <typeparam name="T">要加载资源的类型。</typeparam>
|
||||
/// <param name="assetOperationHandle">资源操作句柄。</param>
|
||||
/// <returns>资源实例。</returns>
|
||||
// ReSharper disable once ParameterHidesMember
|
||||
public T LoadAsset<T>(string assetName, out AssetOperationHandle assetOperationHandle) where T : Object
|
||||
{
|
||||
DirtyInitAssetGroup();
|
||||
return _assetGroup.LoadAsset<T>(assetName, out assetOperationHandle);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 同步加载资源。
|
||||
/// </summary>
|
||||
/// <param name="assetName">要加载资源的名称。</param>
|
||||
/// <param name="parent">父节点位置。</param>
|
||||
/// <typeparam name="T">要加载资源的类型。</typeparam>
|
||||
/// <param name="assetOperationHandle">资源操作句柄。</param>
|
||||
/// <returns>资源实例。</returns>
|
||||
// ReSharper disable once ParameterHidesMember
|
||||
public T LoadAsset<T>(string assetName, Transform parent, out AssetOperationHandle assetOperationHandle)
|
||||
where T : Object
|
||||
{
|
||||
DirtyInitAssetGroup();
|
||||
return _assetGroup.LoadAsset<T>(assetName, parent, out assetOperationHandle);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 异步加载资源实例。
|
||||
/// </summary>
|
||||
/// <param name="assetName">要加载的实例名称。</param>
|
||||
/// <param name="location">资源的定位地址。</param>
|
||||
/// <param name="cancellationToken">取消操作Token。</param>
|
||||
/// <returns>资源实实例。</returns>
|
||||
public async UniTask<T> LoadAssetAsync<T>(string assetName, CancellationToken cancellationToken = default)
|
||||
where T : Object
|
||||
/// <param name="needInstance">是否需要实例化。</param>
|
||||
/// <param name="packageName">指定资源包的名称。不传使用默认资源包。</param>
|
||||
/// <param name="parent">资源实例父节点。</param>
|
||||
/// <typeparam name="T">要加载资源的类型。</typeparam>
|
||||
/// <returns>异步资源实例。</returns>
|
||||
public async UniTask<T> LoadAssetAsync<T>(string location, CancellationToken cancellationToken = default,
|
||||
bool needInstance = true, string packageName = "", Transform parent = null) where T : Object
|
||||
{
|
||||
DirtyInitAssetGroup();
|
||||
return await _assetGroup.LoadAssetAsync<T>(assetName, cancellationToken);
|
||||
return await _assetGroup.LoadAssetAsync<T>(location, cancellationToken, needInstance, packageName, parent);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 异步加载游戏物体。
|
||||
/// </summary>
|
||||
/// <param name="assetName">要加载的游戏物体名称。</param>
|
||||
/// <param name="location">资源的定位地址。</param>
|
||||
/// <param name="cancellationToken">取消操作Token。</param>
|
||||
/// <returns>异步游戏物体实例。</returns>
|
||||
public async UniTask<GameObject> LoadGameObjectAsync(string assetName,
|
||||
CancellationToken cancellationToken = default)
|
||||
/// <param name="needInstance">是否需要实例化。</param>
|
||||
/// <param name="packageName">指定资源包的名称。不传使用默认资源包。</param>
|
||||
/// <param name="parent">资源实例父节点。</param>
|
||||
/// <returns>异步资源实例。</returns>
|
||||
public async UniTask<GameObject> LoadGameObjectAsync(string location, CancellationToken cancellationToken = default,
|
||||
bool needInstance = true, string packageName = "", Transform parent = null)
|
||||
{
|
||||
DirtyInitAssetGroup();
|
||||
return await _assetGroup.LoadGameObjectAsync(assetName, cancellationToken);
|
||||
return await LoadAssetAsync<GameObject>(location, cancellationToken, needInstance, packageName, parent);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
Reference in New Issue
Block a user