From 9bcb636ed72d14adba422410889dafc34f90956c Mon Sep 17 00:00:00 2001 From: ALEXTANG <574809918@qq.com> Date: Thu, 23 Nov 2023 11:44:43 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3SetSprite=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E7=BB=91=E5=AE=9A=E8=B5=84=E6=BA=90=E5=BC=95=E7=94=A8=E5=85=B3?= =?UTF-8?q?=E7=B3=BB=EF=BC=8C=E9=81=BF=E5=85=8D0=E5=BC=95=E7=94=A8?= =?UTF-8?q?=E5=AF=BC=E8=87=B4AssetBundle=E8=A2=AB=E9=87=8A=E6=94=BE?= =?UTF-8?q?=E4=BD=BF=E5=9B=BE=E7=89=87=E4=B8=A2=E5=A4=B1=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修正SetSprite接口绑定资源引用关系,避免0引用导致AssetBundle被释放使图片丢失。 --- .../Runtime/Extension/UnityExtension.cs | 29 +++++++++++++++---- .../Modules/ResourceModule/AssetReference.cs | 6 ++++ 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/UnityProject/Assets/TEngine/Runtime/Extension/UnityExtension.cs b/UnityProject/Assets/TEngine/Runtime/Extension/UnityExtension.cs index 7e6a7127..dbea4fb3 100644 --- a/UnityProject/Assets/TEngine/Runtime/Extension/UnityExtension.cs +++ b/UnityProject/Assets/TEngine/Runtime/Extension/UnityExtension.cs @@ -149,12 +149,14 @@ namespace TEngine { if (!isAsync) { - image.sprite = - GameModule.Resource.LoadAsset(spriteName, customPackageName: customPackageName); + var operation = GameModule.Resource.LoadAssetGetOperation(spriteName, customPackageName: customPackageName); + image.sprite = operation.AssetObject as Sprite; if (isSetNativeSize) { image.SetNativeSize(); } + + image.gameObject.GetOrAddComponent().Reference(operation, spriteName); } else { @@ -162,14 +164,16 @@ namespace TEngine { if (image == null) { + operation.Dispose(); + operation = null; return; } - image.sprite = operation.AssetObject as Sprite; if (isSetNativeSize) { image.SetNativeSize(); } + image.gameObject.GetOrAddComponent().Reference(operation, spriteName); }, customPackageName: customPackageName); } } @@ -198,8 +202,10 @@ namespace TEngine { if (!isAsync) { - spriteRenderer.sprite = - GameModule.Resource.LoadAsset(spriteName, customPackageName: customPackageName); + var operation = GameModule.Resource.LoadAssetGetOperation(spriteName, customPackageName: customPackageName); + spriteRenderer.sprite = operation.AssetObject as Sprite; + + spriteRenderer.gameObject.GetOrAddComponent().Reference(operation, spriteName); } else { @@ -207,10 +213,13 @@ namespace TEngine { if (spriteRenderer == null) { + operation.Dispose(); + operation = null; return; } spriteRenderer.sprite = operation.AssetObject as Sprite; + spriteRenderer.gameObject.GetOrAddComponent().Reference(operation, spriteName); }, customPackageName: customPackageName); } } @@ -281,5 +290,15 @@ namespace TEngine return null; } + + public static AssetReference GetAssetReference(this GameObject gameObject) + { + if (gameObject == null) + { + return null; + } + + return gameObject.GetComponent(); + } } } \ No newline at end of file diff --git a/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/AssetReference.cs b/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/AssetReference.cs index 0364329a..7a73b985 100644 --- a/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/AssetReference.cs +++ b/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/AssetReference.cs @@ -59,6 +59,12 @@ namespace TEngine public void Bind(AssetOperationHandle operation, string assetLocation, AssetReference parent = null, string packageName = "") { + if (_operationHandle != null) + { + Log.Warning($"rebind AssetReference gameObject.name:{gameObject.name} assetLocation:{assetLocation}"); + _operationHandle.Dispose(); + _operationHandle = null; + } _operationHandle = operation; this._assetLocation = assetLocation; this._packageName = packageName;