AssetsReference支持Unity实例化接口GameObject.Instantiate

AssetsReference支持Unity实例化接口GameObject.Instantiate
This commit is contained in:
Alex-Rachel
2025-05-20 12:54:15 +08:00
parent 62c05e7c2b
commit e7b07dfea2

View File

@@ -20,19 +20,26 @@ namespace TEngine
}
}
[DisallowMultipleComponent]
public sealed class AssetsReference : MonoBehaviour
{
private static readonly Dictionary<GameObject, int> _gameObjectCountMap = new Dictionary<GameObject, int>();
[SerializeField]
private GameObject sourceGameObject;
[SerializeField]
private List<AssetsRefInfo> 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<IResourceModule>();
}
@@ -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;
}