using System; using System.Collections.Generic; using AlicizaX; using UnityEngine; using UnityEngine.Serialization; using Object = UnityEngine.Object; namespace AlicizaX.Resource.Runtime { [Serializable] public struct AssetsRefInfo { public int instanceId; public Object refAsset; public AssetsRefInfo(Object refAsset) { this.refAsset = refAsset; instanceId = this.refAsset.GetInstanceID(); } } public sealed class AssetsReference : MonoBehaviour { [SerializeField] private GameObject sourceGameObject; [SerializeField] private List refAssetInfoList; private IResourceModule _resourceModule; private void OnDestroy() { if (_resourceModule == null) { _resourceModule = ModuleSystem.GetModule(); } if (_resourceModule == null) { throw new GameFrameworkException($"resourceModule is null."); } if (sourceGameObject != null) { _resourceModule.UnloadAsset(sourceGameObject); } ReleaseRefAssetInfoList(); } private void ReleaseRefAssetInfoList() { if (refAssetInfoList != null) { foreach (var refInfo in refAssetInfoList) { _resourceModule.UnloadAsset(refInfo.refAsset); } refAssetInfoList.Clear(); } } public AssetsReference Ref(GameObject source, IResourceModule resourceModule = null) { if (source == null) { throw new GameFrameworkException($"Source gameObject is null."); } if (source.scene.name != null) { throw new GameFrameworkException($"Source gameObject is in scene."); } _resourceModule = resourceModule; sourceGameObject = source; return this; } public AssetsReference Ref(T source, IResourceModule resourceModule = null) where T : UnityEngine.Object { if (source == null) { throw new GameFrameworkException($"Source gameObject is null."); } _resourceModule = resourceModule; if (refAssetInfoList == null) { refAssetInfoList = new List(); } refAssetInfoList.Add(new AssetsRefInfo(source)); return this; } public static AssetsReference Instantiate(GameObject source, Transform parent = null, IResourceModule resourceModule = null) { if (source == null) { throw new GameFrameworkException($"Source gameObject is null."); } if (source.scene.name != null) { throw new GameFrameworkException($"Source gameObject is in scene."); } GameObject instance = Object.Instantiate(source, parent); return instance.AddComponent().Ref(source, resourceModule); } public static AssetsReference Ref(GameObject source, GameObject instance, IResourceModule resourceModule = null) { if (source == null) { throw new GameFrameworkException($"Source gameObject is null."); } if (source.scene.name != null) { throw new GameFrameworkException($"Source gameObject is in scene."); } var comp = instance.GetComponent(); return comp ? comp : instance.AddComponent().Ref(source, resourceModule); } public static AssetsReference Ref(T source, GameObject instance, IResourceModule resourceModule = null) where T : UnityEngine.Object { if (source == null) { throw new GameFrameworkException($"Source gameObject is null."); } var comp = instance.GetComponent(); return comp ? comp : instance.AddComponent().Ref(source, resourceModule); } } }