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

View File

@@ -12,6 +12,7 @@ namespace TEngine
public sealed class AssetReference : MonoBehaviour public sealed class AssetReference : MonoBehaviour
{ {
private AssetOperationHandle _operationHandle; private AssetOperationHandle _operationHandle;
private int _instanceID = 0; private int _instanceID = 0;
private string _assetLocation; private string _assetLocation;
private AssetGroup _assetGroup; private AssetGroup _assetGroup;
@@ -21,6 +22,14 @@ namespace TEngine
/// </summary> /// </summary>
public AssetGroup AssetGroup => _assetGroup; 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() private void Awake()
{ {
if (_assetGroup == null) 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; _operationHandle = operation;
this._assetLocation = assetLocation; this._assetLocation = assetLocation;
_instanceID = gameObject.GetInstanceID(); _instanceID = gameObject.GetInstanceID();
if (parent != null)
{
Parent = parent;
}
} }
private void OnDestroy() private void OnDestroy()
@@ -43,6 +56,7 @@ namespace TEngine
_operationHandle.Release(); _operationHandle.Release();
_operationHandle = null; _operationHandle = null;
} }
if (_assetGroup == null) if (_assetGroup == null)
{ {
AssetGroup.Release(_assetGroup); AssetGroup.Release(_assetGroup);
@@ -52,34 +66,34 @@ namespace TEngine
#region Public Methods #region Public Methods
/// <summary> /// <summary>
/// 注册资源数据到资源组内。 /// 引用资源数据到资源组内。
/// </summary> /// </summary>
/// <param name="handle">资源操作句柄。</param> /// <param name="handle">资源操作句柄。</param>
/// <param name="assetTag">资源标识。</param> /// <param name="assetTag">资源标识。</param>
/// <returns>是否注册成功。</returns> /// <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>
/// 从资源组内反注册资源数据。 /// 从资源组内释放资源数据。
/// </summary> /// </summary>
/// <param name="assetTag"></param> /// <param name="assetTag"></param>
/// <returns></returns> /// <returns></returns>
public bool UnRegister(string assetTag) public bool Release(string assetTag)
{ {
return _assetGroup.UnRegister(assetTag); return _assetGroup.Release(assetTag);
} }
/// <summary> /// <summary>
/// 从资源组内反注册资源数据。 /// 从资源组内释放资源数据。
/// </summary> /// </summary>
/// <param name="handle"></param> /// <param name="handle"></param>
/// <returns></returns> /// <returns></returns>
public bool UnRegister(AssetOperationHandle handle) public bool Release(AssetOperationHandle handle)
{ {
return _assetGroup.UnRegister(handle); return _assetGroup.Release(handle);
} }
@@ -106,13 +120,41 @@ namespace TEngine
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> /// <summary>
/// 异步加载资源实例。 /// 异步加载资源实例。
/// </summary> /// </summary>
/// <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) 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);
} }
@@ -128,8 +170,17 @@ namespace TEngine
return await _assetGroup.LoadGameObjectAsync(assetName, cancellationToken); return await _assetGroup.LoadGameObjectAsync(assetName, cancellationToken);
} }
/// <summary>
public static bool BindAssetReference(GameObject go,AssetOperationHandle handle,string location) /// 绑定资源引用。
/// </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) if (go == null)
{ {
@@ -141,10 +192,13 @@ namespace TEngine
throw new GameFrameworkException($"BindAssetReference Failed => AssetOperationHandle is null!"); 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 #endregion
} }
} }