mirror of
https://github.com/Alex-Rachel/TEngine.git
synced 2025-08-07 16:45:10 +00:00
[+] AssetRefrence
[+] AssetRefrence
This commit is contained in:
@@ -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,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>
|
||||
/// <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;
|
||||
}
|
||||
|
||||
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)
|
||||
/// <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)
|
||||
{
|
||||
UnRegister(handle);
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
GameObject ret = handle.InstantiateSync();
|
||||
|
||||
return ret;
|
||||
return await LoadAssetAsync<GameObject>(assetName,cancellationToken,assetOperationHandle);
|
||||
}
|
||||
}
|
||||
}
|
@@ -12,6 +12,7 @@ namespace TEngine
|
||||
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,6 +56,7 @@ namespace TEngine
|
||||
_operationHandle.Release();
|
||||
_operationHandle = null;
|
||||
}
|
||||
|
||||
if (_assetGroup == null)
|
||||
{
|
||||
AssetGroup.Release(_assetGroup);
|
||||
@@ -52,34 +66,34 @@ namespace TEngine
|
||||
|
||||
#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);
|
||||
}
|
||||
|
||||
|
||||
@@ -106,13 +120,41 @@ namespace TEngine
|
||||
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>
|
||||
/// <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);
|
||||
}
|
||||
@@ -128,8 +170,17 @@ namespace TEngine
|
||||
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
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user