using System; using System.Collections.Generic; using AlicizaX.Runtime; using UnityEngine; 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 ResourceComponent _resourceComponent; private void OnDestroy() { if (_resourceComponent == null) { _resourceComponent = GameEntry.GetComponent(); } if (_resourceComponent == null) { throw new GameFrameworkException($"ResourceManager is null."); } if (_sourceGameObject != null) { _resourceComponent.UnloadAsset(_sourceGameObject); } ReleaseRefAssetInfoList(); } private void ReleaseRefAssetInfoList() { if (_refAssetInfoList != null) { foreach (var refInfo in _refAssetInfoList) { _resourceComponent.UnloadAsset(refInfo.refAsset); } _refAssetInfoList.Clear(); } } public AssetsReference Ref(GameObject source) { if (source == null) { throw new GameFrameworkException($"Source gameObject is null."); } if (source.scene.name != null) { throw new GameFrameworkException($"Source gameObject is in scene."); } _sourceGameObject = source; return this; } public AssetsReference Ref(T source) where T : UnityEngine.Object { if (source == null) { throw new GameFrameworkException($"Source gameObject is null."); } if (_refAssetInfoList == null) { _refAssetInfoList = new List(); } _refAssetInfoList.Add(new AssetsRefInfo(source)); return this; } public static AssetsReference Instantiate(GameObject source, Transform parent = 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); } public static AssetsReference Ref(GameObject source, GameObject instance) { if (source == null) { throw new GameFrameworkException($"Source gameObject is null."); } if (source.scene.name != null) { throw new GameFrameworkException($"Source gameObject is in scene."); } return instance.GetOrAddComponent().Ref(source); } public static AssetsReference Ref(T source, GameObject instance) where T : UnityEngine.Object { if (source == null) { throw new GameFrameworkException($"Source gameObject is null."); } return instance.GetOrAddComponent().Ref(source); } } }