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>();
|
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))
|
||||||
{
|
{
|
||||||
@@ -244,29 +244,110 @@ namespace TEngine
|
|||||||
return handle.AssetObject as T;
|
return handle.AssetObject as T;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <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;
|
||||||
}
|
}
|
||||||
|
|
||||||
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>
|
/// <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>
|
||||||
if (cancelOrFailed)
|
/// <param name="assetName">要加载的游戏物体名称。</param>
|
||||||
{
|
/// <param name="cancellationToken">取消操作Token。</param>
|
||||||
UnRegister(handle);
|
/// <param name="assetOperationHandle">资源操作句柄。</param>
|
||||||
|
/// <returns>异步游戏物体实例。</returns>
|
||||||
return null;
|
public async UniTask<GameObject> LoadGameObjectAsync(string assetName, CancellationToken cancellationToken,AssetOperationHandle assetOperationHandle)
|
||||||
}
|
{
|
||||||
|
return await LoadAssetAsync<GameObject>(assetName,cancellationToken,assetOperationHandle);
|
||||||
GameObject ret = handle.InstantiateSync();
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -9,9 +9,10 @@ namespace TEngine
|
|||||||
/// 资源引用标识。
|
/// 资源引用标识。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[DisallowMultipleComponent, AddComponentMenu("")]
|
[DisallowMultipleComponent, AddComponentMenu("")]
|
||||||
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;
|
||||||
@@ -20,7 +21,15 @@ 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)
|
||||||
@@ -28,12 +37,16 @@ namespace TEngine
|
|||||||
_assetGroup = AssetGroup.Alloc();
|
_assetGroup = AssetGroup.Alloc();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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,46 +56,47 @@ namespace TEngine
|
|||||||
_operationHandle.Release();
|
_operationHandle.Release();
|
||||||
_operationHandle = null;
|
_operationHandle = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_assetGroup == null)
|
if (_assetGroup == null)
|
||||||
{
|
{
|
||||||
AssetGroup.Release(_assetGroup);
|
AssetGroup.Release(_assetGroup);
|
||||||
_assetGroup = null;
|
_assetGroup = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 同步加载资源。
|
/// 同步加载资源。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -103,7 +117,34 @@ namespace TEngine
|
|||||||
/// <returns>资源实例。</returns>
|
/// <returns>资源实例。</returns>
|
||||||
public T LoadAsset<T>(string assetName, Transform parent) where T : Object
|
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>
|
/// <summary>
|
||||||
@@ -112,9 +153,10 @@ namespace TEngine
|
|||||||
/// <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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -125,11 +167,20 @@ namespace TEngine
|
|||||||
/// <returns>异步游戏物体实例。</returns>
|
/// <returns>异步游戏物体实例。</returns>
|
||||||
public async UniTask<GameObject> LoadGameObjectAsync(string assetName, CancellationToken cancellationToken)
|
public async UniTask<GameObject> LoadGameObjectAsync(string assetName, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
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
|
||||||
}
|
}
|
||||||
}
|
}
|
Reference in New Issue
Block a user