[+] AssetRefrence

[+] AssetRefrence
This commit is contained in:
ALEXTANG
2023-05-11 00:25:00 +08:00
parent 026a1f458c
commit 699930f6e8
2 changed files with 189 additions and 57 deletions

View File

@@ -79,12 +79,12 @@ namespace TEngine
private readonly GameFrameworkLinkedList<AssetHandleData> _assetHandleDataLinkedList = new GameFrameworkLinkedList<AssetHandleData>();
/// <summary>
/// 注册资源数据到资源组内。
/// 引用资源数据到资源组内。
/// </summary>
/// <param name="handle">资源操作句柄。</param>
/// <param name="assetTag">资源标识。</param>
/// <returns>是否注册成功。</returns>
public bool Register(AssetOperationHandle handle,string assetTag = "")
public bool Reference(AssetOperationHandle handle,string assetTag = "")
{
AssetHandleData handleData = AssetHandleData.Alloc(handle,assetTag);
_assetHandleDataLinkedList.AddLast(handleData);
@@ -92,11 +92,11 @@ namespace TEngine
}
/// <summary>
/// 从资源组内反注册资源数据。
/// 从资源组内释放资源数据。
/// </summary>
/// <param name="assetTag"></param>
/// <returns></returns>
public bool UnRegister(string assetTag)
/// <param name="assetTag">资源标签。</param>
/// <returns>是否释放成功。</returns>
public bool Release(string assetTag)
{
AssetHandleData founded = null;
foreach (var assetHandleData in _assetHandleDataLinkedList)
@@ -120,11 +120,11 @@ namespace TEngine
}
/// <summary>
/// 从资源组内反注册资源数据。
/// 从资源组内释放资源数据。
/// </summary>
/// <param name="handle"></param>
/// <returns></returns>
public bool UnRegister(AssetOperationHandle handle)
/// <param name="handle">资源操作句柄。</param>
/// <returns>是否释放成功。</returns>
public bool Release(AssetOperationHandle handle)
{
AssetHandleData founded = null;
foreach (var assetHandleData in _assetHandleDataLinkedList)
@@ -202,7 +202,7 @@ namespace TEngine
AssetOperationHandle handle = GameModule.Resource.LoadAssetGetOperation<T>(assetName);
Register(handle);
Reference(handle);
if (typeof(T) == typeof(GameObject))
{
@@ -232,7 +232,7 @@ namespace TEngine
AssetOperationHandle handle = GameModule.Resource.LoadAssetGetOperation<T>(assetName);
Register(handle);
Reference(handle);
if (typeof(T) == typeof(GameObject))
{
@@ -245,28 +245,109 @@ 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 (string.IsNullOrEmpty(assetName))
{
Log.Error("Asset name is invalid.");
return default;
}
assetOperationHandle = GameModule.Resource.LoadAssetGetOperation<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;
}
assetOperationHandle = GameModule.Resource.LoadAssetGetOperation<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="cancellationToken">取消操作Token。</param>
/// <param name="assetOperationHandle">资源操作句柄。</param>
/// <returns>资源实实例。</returns>
public async UniTask<T> LoadAssetAsync<T>(string assetName, CancellationToken cancellationToken) where T : Object
// ReSharper disable once UnusedParameter.Global
// ReSharper disable once RedundantAssignment
public async UniTask<T> LoadAssetAsync<T>(string assetName, CancellationToken cancellationToken,AssetOperationHandle assetOperationHandle = null) where T : Object
{
AssetOperationHandle handle = GameModule.Resource.LoadAssetAsyncHandle<GameObject>(assetName);
Register(handle);
Reference(handle);
bool cancelOrFailed = await handle.ToUniTask(cancellationToken: cancellationToken).SuppressCancellationThrow();
if (cancelOrFailed)
{
UnRegister(handle);
Release(handle);
return null;
}
return handle.AssetObject as T;
assetOperationHandle = handle;
if (typeof(T) == typeof(GameObject))
{
GameObject ret = handle.InstantiateSync();
return ret as T;
}
else
{
return handle.AssetObject as T;
}
}
/// <summary>
@@ -277,22 +358,19 @@ namespace TEngine
/// <returns>异步游戏物体实例。</returns>
public async UniTask<GameObject> LoadGameObjectAsync(string assetName, CancellationToken cancellationToken)
{
AssetOperationHandle handle = GameModule.Resource.LoadAssetAsyncHandle<GameObject>(assetName);
return await LoadAssetAsync<GameObject>(assetName,cancellationToken);
}
Register(handle);
bool cancelOrFailed = await handle.ToUniTask(cancellationToken: cancellationToken).SuppressCancellationThrow();
if (cancelOrFailed)
{
UnRegister(handle);
return null;
}
GameObject ret = handle.InstantiateSync();
return ret;
/// <summary>
/// 异步加载游戏物体。
/// </summary>
/// <param name="assetName">要加载的游戏物体名称。</param>
/// <param name="cancellationToken">取消操作Token。</param>
/// <param name="assetOperationHandle">资源操作句柄。</param>
/// <returns>异步游戏物体实例。</returns>
public async UniTask<GameObject> LoadGameObjectAsync(string assetName, CancellationToken cancellationToken,AssetOperationHandle assetOperationHandle)
{
return await LoadAssetAsync<GameObject>(assetName,cancellationToken,assetOperationHandle);
}
}
}

View File

@@ -9,9 +9,10 @@ namespace TEngine
/// 资源引用标识。
/// </summary>
[DisallowMultipleComponent, AddComponentMenu("")]
public sealed class AssetReference: MonoBehaviour
public sealed class AssetReference : MonoBehaviour
{
private AssetOperationHandle _operationHandle;
private int _instanceID = 0;
private string _assetLocation;
private AssetGroup _assetGroup;
@@ -21,6 +22,14 @@ namespace TEngine
/// </summary>
public AssetGroup AssetGroup => _assetGroup;
public AssetReference Parent { protected set; get; }
// ReSharper disable once ConvertToAutoPropertyWithPrivateSetter
// ReSharper disable once InconsistentNaming
public AssetOperationHandle assetOperationHandle => _operationHandle;
public string AssetLocation => _assetLocation;
private void Awake()
{
if (_assetGroup == null)
@@ -29,11 +38,15 @@ namespace TEngine
}
}
public void Bind(AssetOperationHandle operation,string assetLocation)
public void Bind(AssetOperationHandle operation, string assetLocation, AssetReference parent = null)
{
_operationHandle = operation;
this._assetLocation = assetLocation;
_instanceID = gameObject.GetInstanceID();
if (parent != null)
{
Parent = parent;
}
}
private void OnDestroy()
@@ -43,43 +56,44 @@ namespace TEngine
_operationHandle.Release();
_operationHandle = null;
}
if (_assetGroup == null)
{
AssetGroup.Release(_assetGroup);
_assetGroup = null;
AssetGroup.Release(_assetGroup);
_assetGroup = null;
}
}
#region Public Methods
/// <summary>
/// 注册资源数据到资源组内。
/// 引用资源数据到资源组内。
/// </summary>
/// <param name="handle">资源操作句柄。</param>
/// <param name="assetTag">资源标识。</param>
/// <returns>是否注册成功。</returns>
public bool Register(AssetOperationHandle handle,string assetTag = "")
public bool Reference(AssetOperationHandle handle, string assetTag = "")
{
return _assetGroup.Register(handle,assetTag);
return _assetGroup.Reference(handle, assetTag);
}
/// <summary>
/// 从资源组内反注册资源数据。
/// 从资源组内释放资源数据。
/// </summary>
/// <param name="assetTag"></param>
/// <returns></returns>
public bool UnRegister(string assetTag)
public bool Release(string assetTag)
{
return _assetGroup.UnRegister(assetTag);
return _assetGroup.Release(assetTag);
}
/// <summary>
/// 从资源组内反注册资源数据。
/// 从资源组内释放资源数据。
/// </summary>
/// <param name="handle"></param>
/// <returns></returns>
public bool UnRegister(AssetOperationHandle handle)
public bool Release(AssetOperationHandle handle)
{
return _assetGroup.UnRegister(handle);
return _assetGroup.Release(handle);
}
@@ -103,7 +117,34 @@ namespace TEngine
/// <returns>资源实例。</returns>
public T LoadAsset<T>(string assetName, Transform parent) where T : Object
{
return _assetGroup.LoadAsset<T>(assetName,parent);
return _assetGroup.LoadAsset<T>(assetName, 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
{
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
{
return _assetGroup.LoadAsset<T>(assetName, parent,out assetOperationHandle);
}
/// <summary>
@@ -112,9 +153,10 @@ namespace TEngine
/// <param name="assetName">要加载的实例名称。</param>
/// <param name="cancellationToken">取消操作Token。</param>
/// <returns>资源实实例。</returns>
public async UniTask<T> LoadAssetAsync<T>(string assetName, CancellationToken cancellationToken) where T : Object
public async UniTask<T> LoadAssetAsync<T>(string assetName, CancellationToken cancellationToken)
where T : Object
{
return await _assetGroup.LoadAssetAsync<T>(assetName,cancellationToken);
return await _assetGroup.LoadAssetAsync<T>(assetName, cancellationToken);
}
/// <summary>
@@ -125,11 +167,20 @@ namespace TEngine
/// <returns>异步游戏物体实例。</returns>
public async UniTask<GameObject> LoadGameObjectAsync(string assetName, CancellationToken cancellationToken)
{
return await _assetGroup.LoadGameObjectAsync(assetName,cancellationToken);
return await _assetGroup.LoadGameObjectAsync(assetName, cancellationToken);
}
public static bool BindAssetReference(GameObject go,AssetOperationHandle handle,string location)
/// <summary>
/// 绑定资源引用。
/// </summary>
/// <param name="go">游戏物体实例。</param>
/// <param name="handle">资源句柄。</param>
/// <param name="location">资源定位地址。</param>
/// <param name="parent">父级引用。</param>
/// <returns>资源引用组件。</returns>
/// <exception cref="GameFrameworkException">捕获异常。</exception>
public static AssetReference BindAssetReference(GameObject go, AssetOperationHandle handle = null,
string location = "", AssetReference parent = null)
{
if (go == null)
{
@@ -141,10 +192,13 @@ namespace TEngine
throw new GameFrameworkException($"BindAssetReference Failed => AssetOperationHandle is null!");
}
go.AddComponent<AssetReference>().Bind(handle,location);
var ret = go.AddComponent<AssetReference>();
return true;
ret.Bind(operation: handle, assetLocation: location, parent: parent);
return ret;
}
#endregion
}
}