From e7b07dfea2ffeac5f030f716d3174617ee283ea6 Mon Sep 17 00:00:00 2001 From: Alex-Rachel <574809918@qq.com> Date: Tue, 20 May 2025 12:54:15 +0800 Subject: [PATCH] =?UTF-8?q?AssetsReference=E6=94=AF=E6=8C=81Unity=E5=AE=9E?= =?UTF-8?q?=E4=BE=8B=E5=8C=96=E6=8E=A5=E5=8F=A3GameObject.Instantiate?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit AssetsReference支持Unity实例化接口GameObject.Instantiate --- .../Reference/AssetsReference.cs | 60 +++++++++++++++++-- 1 file changed, 56 insertions(+), 4 deletions(-) diff --git a/UnityProject/Assets/TEngine/Runtime/Module/ResourceModule/Reference/AssetsReference.cs b/UnityProject/Assets/TEngine/Runtime/Module/ResourceModule/Reference/AssetsReference.cs index 8cd2895d..ee1f64be 100644 --- a/UnityProject/Assets/TEngine/Runtime/Module/ResourceModule/Reference/AssetsReference.cs +++ b/UnityProject/Assets/TEngine/Runtime/Module/ResourceModule/Reference/AssetsReference.cs @@ -20,19 +20,26 @@ namespace TEngine } } + [DisallowMultipleComponent] public sealed class AssetsReference : MonoBehaviour { + private static readonly Dictionary _gameObjectCountMap = new Dictionary(); + [SerializeField] private GameObject sourceGameObject; [SerializeField] private List refAssetInfoList; - private IResourceModule _resourceModule; + private static IResourceModule _resourceModule; - private void OnDestroy() + private void CheckInit() { - if (_resourceModule == null) + if (_resourceModule != null) + { + return; + } + else { _resourceModule = ModuleSystem.GetModule(); } @@ -41,10 +48,54 @@ namespace TEngine { throw new GameFrameworkException($"resourceModule is null."); } + } + private void CheckRelease() + { + if (_gameObjectCountMap.TryGetValue(sourceGameObject, out var count)) + { + if (count <= 1) + { + _gameObjectCountMap.Remove(sourceGameObject); + _resourceModule.UnloadAsset(sourceGameObject); + } + else + { + _gameObjectCountMap[sourceGameObject] = count - 1; + } + } + else + { + Log.Warning($"sourceGameObject is not invalid."); + } + } + + private void CheckAdd() + { + if (_gameObjectCountMap.TryGetValue(sourceGameObject, out var count)) + { + _gameObjectCountMap[sourceGameObject] = count + 1; + } + else + { + _gameObjectCountMap[sourceGameObject] = 1; + } + } + + private void Awake() + { if (sourceGameObject != null) { - _resourceModule.UnloadAsset(sourceGameObject); + _gameObjectCountMap[sourceGameObject] = _gameObjectCountMap.TryGetValue(sourceGameObject, out var count) ? count + 1 : 1; + } + } + + private void OnDestroy() + { + CheckInit(); + if (sourceGameObject != null) + { + CheckRelease(); } ReleaseRefAssetInfoList(); @@ -77,6 +128,7 @@ namespace TEngine _resourceModule = resourceModule; sourceGameObject = source; + CheckAdd(); return this; }