diff --git a/Assets/TEngine/Runtime/GameFramework/Resource/AssetGroup.cs b/Assets/TEngine/Runtime/GameFramework/Resource/AssetGroup.cs index 1909f018..d816997a 100644 --- a/Assets/TEngine/Runtime/GameFramework/Resource/AssetGroup.cs +++ b/Assets/TEngine/Runtime/GameFramework/Resource/AssetGroup.cs @@ -79,12 +79,12 @@ namespace TEngine private readonly GameFrameworkLinkedList _assetHandleDataLinkedList = new GameFrameworkLinkedList(); /// - /// 注册资源数据到资源组内。 + /// 引用资源数据到资源组内。 /// /// 资源操作句柄。 /// 资源标识。 /// 是否注册成功。 - 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 } /// - /// 从资源组内反注册资源数据。 + /// 从资源组内释放资源数据。 /// - /// - /// - public bool UnRegister(string assetTag) + /// 资源标签。 + /// 是否释放成功。 + public bool Release(string assetTag) { AssetHandleData founded = null; foreach (var assetHandleData in _assetHandleDataLinkedList) @@ -120,11 +120,11 @@ namespace TEngine } /// - /// 从资源组内反注册资源数据。 + /// 从资源组内释放资源数据。 /// - /// - /// - public bool UnRegister(AssetOperationHandle handle) + /// 资源操作句柄。 + /// 是否释放成功。 + public bool Release(AssetOperationHandle handle) { AssetHandleData founded = null; foreach (var assetHandleData in _assetHandleDataLinkedList) @@ -202,7 +202,7 @@ namespace TEngine AssetOperationHandle handle = GameModule.Resource.LoadAssetGetOperation(assetName); - Register(handle); + Reference(handle); if (typeof(T) == typeof(GameObject)) { @@ -232,7 +232,7 @@ namespace TEngine AssetOperationHandle handle = GameModule.Resource.LoadAssetGetOperation(assetName); - Register(handle); + Reference(handle); if (typeof(T) == typeof(GameObject)) { @@ -244,29 +244,110 @@ namespace TEngine return handle.AssetObject as T; } } + + /// + /// 同步加载资源。 + /// + /// 要加载资源的名称。 + /// 要加载资源的类型。 + /// 资源操作句柄。 + /// 资源实例。 + public T LoadAsset(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(assetName); + + Reference(assetOperationHandle); + + if (typeof(T) == typeof(GameObject)) + { + GameObject ret = assetOperationHandle.InstantiateSync(); + return ret as T; + } + else + { + return assetOperationHandle.AssetObject as T; + } + } + + /// + /// 同步加载资源。 + /// + /// 要加载资源的名称。 + /// 父节点位置。 + /// 资源操作句柄。 + /// 要加载资源的类型。 + /// 资源实例。 + public T LoadAsset(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(assetName); + + Reference(assetOperationHandle); + + if (typeof(T) == typeof(GameObject)) + { + GameObject ret = assetOperationHandle.InstantiateSync(parent); + return ret as T; + } + else + { + return assetOperationHandle.AssetObject as T; + } + } /// /// 异步加载资源实例。 /// /// 要加载的实例名称。 /// 取消操作Token。 + /// 资源操作句柄。 /// 资源实实例。 - public async UniTask LoadAssetAsync(string assetName, CancellationToken cancellationToken) where T : Object + // ReSharper disable once UnusedParameter.Global + // ReSharper disable once RedundantAssignment + public async UniTask LoadAssetAsync(string assetName, CancellationToken cancellationToken,AssetOperationHandle assetOperationHandle = null) where T : Object { AssetOperationHandle handle = GameModule.Resource.LoadAssetAsyncHandle(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; + } } /// @@ -277,22 +358,19 @@ namespace TEngine /// 异步游戏物体实例。 public async UniTask LoadGameObjectAsync(string assetName, CancellationToken cancellationToken) { - AssetOperationHandle handle = GameModule.Resource.LoadAssetAsyncHandle(assetName); - - Register(handle); - - bool cancelOrFailed = await handle.ToUniTask(cancellationToken: cancellationToken).SuppressCancellationThrow(); - - if (cancelOrFailed) - { - UnRegister(handle); - - return null; - } - - GameObject ret = handle.InstantiateSync(); - - return ret; + return await LoadAssetAsync(assetName,cancellationToken); + } + + /// + /// 异步加载游戏物体。 + /// + /// 要加载的游戏物体名称。 + /// 取消操作Token。 + /// 资源操作句柄。 + /// 异步游戏物体实例。 + public async UniTask LoadGameObjectAsync(string assetName, CancellationToken cancellationToken,AssetOperationHandle assetOperationHandle) + { + return await LoadAssetAsync(assetName,cancellationToken,assetOperationHandle); } } } \ No newline at end of file diff --git a/Assets/TEngine/Runtime/GameFramework/Resource/AssetReference.cs b/Assets/TEngine/Runtime/GameFramework/Resource/AssetReference.cs index b4ec05bd..7f1768e1 100644 --- a/Assets/TEngine/Runtime/GameFramework/Resource/AssetReference.cs +++ b/Assets/TEngine/Runtime/GameFramework/Resource/AssetReference.cs @@ -9,9 +9,10 @@ namespace TEngine /// 资源引用标识。 /// [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; @@ -20,7 +21,15 @@ namespace TEngine /// 资源组。 /// 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) @@ -28,12 +37,16 @@ namespace TEngine _assetGroup = AssetGroup.Alloc(); } } - - 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,46 +56,47 @@ namespace TEngine _operationHandle.Release(); _operationHandle = null; } + if (_assetGroup == null) { - AssetGroup.Release(_assetGroup); - _assetGroup = null; + AssetGroup.Release(_assetGroup); + _assetGroup = null; } } #region Public Methods /// - /// 注册资源数据到资源组内。 + /// 引用资源数据到资源组内。 /// /// 资源操作句柄。 /// 资源标识。 /// 是否注册成功。 - public bool Register(AssetOperationHandle handle,string assetTag = "") + public bool Reference(AssetOperationHandle handle, string assetTag = "") { - return _assetGroup.Register(handle,assetTag); + return _assetGroup.Reference(handle, assetTag); } /// - /// 从资源组内反注册资源数据。 + /// 从资源组内释放资源数据。 /// /// /// - public bool UnRegister(string assetTag) + public bool Release(string assetTag) { - return _assetGroup.UnRegister(assetTag); + return _assetGroup.Release(assetTag); } - + /// - /// 从资源组内反注册资源数据。 + /// 从资源组内释放资源数据。 /// /// /// - public bool UnRegister(AssetOperationHandle handle) + public bool Release(AssetOperationHandle handle) { - return _assetGroup.UnRegister(handle); + return _assetGroup.Release(handle); } - + /// /// 同步加载资源。 /// @@ -103,7 +117,34 @@ namespace TEngine /// 资源实例。 public T LoadAsset(string assetName, Transform parent) where T : Object { - return _assetGroup.LoadAsset(assetName,parent); + return _assetGroup.LoadAsset(assetName, parent); + } + + /// + /// 同步加载资源。 + /// + /// 要加载资源的名称。 + /// 要加载资源的类型。 + /// 资源操作句柄。 + /// 资源实例。 + // ReSharper disable once ParameterHidesMember + public T LoadAsset(string assetName, out AssetOperationHandle assetOperationHandle) where T : Object + { + return _assetGroup.LoadAsset(assetName,out assetOperationHandle); + } + + /// + /// 同步加载资源。 + /// + /// 要加载资源的名称。 + /// 父节点位置。 + /// 要加载资源的类型。 + /// 资源操作句柄。 + /// 资源实例。 + // ReSharper disable once ParameterHidesMember + public T LoadAsset(string assetName, Transform parent, out AssetOperationHandle assetOperationHandle) where T : Object + { + return _assetGroup.LoadAsset(assetName, parent,out assetOperationHandle); } /// @@ -112,9 +153,10 @@ namespace TEngine /// 要加载的实例名称。 /// 取消操作Token。 /// 资源实实例。 - public async UniTask LoadAssetAsync(string assetName, CancellationToken cancellationToken) where T : Object + public async UniTask LoadAssetAsync(string assetName, CancellationToken cancellationToken) + where T : Object { - return await _assetGroup.LoadAssetAsync(assetName,cancellationToken); + return await _assetGroup.LoadAssetAsync(assetName, cancellationToken); } /// @@ -125,11 +167,20 @@ namespace TEngine /// 异步游戏物体实例。 public async UniTask 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) + + /// + /// 绑定资源引用。 + /// + /// 游戏物体实例。 + /// 资源句柄。 + /// 资源定位地址。 + /// 父级引用。 + /// 资源引用组件。 + /// 捕获异常。 + 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().Bind(handle,location); + var ret = go.AddComponent(); - return true; + ret.Bind(operation: handle, assetLocation: location, parent: parent); + + return ret; } + #endregion } } \ No newline at end of file