using GFGGame.Launcher; using System.Threading.Tasks; using UniFramework.Pooling; using UnityEngine; using YooAsset; using System.Collections.Generic; namespace GFGGame { public class PrefabManager : SingletonMonoBase { private Spawner _entitySpawner; private GameObject preDrawRoot; private Dictionary> preDrawDic = new Dictionary>(); private void Awake() { preDrawRoot = new GameObject("PredrawRoot"); preDrawRoot.transform.position = new Vector3(0, 0, 0); preDrawRoot.transform.localScale = Vector3.zero; } public void Init() { // 创建游戏对象发生器 _entitySpawner = UniPooling.CreateSpawner(VersionController.DefaultPackage); } public GameObject SpawnSync(string resPath) { var t = GetPreDrawObj(resPath); if(t != null) { return t; } if (!YooAssets.CheckResExist(resPath)) { return null; } if (!_entitySpawner.IsGameObjectPoolExisted(resPath)) { // 创建游戏对象池,销毁时间单位为秒 _entitySpawner.CreateGameObjectPoolSync(resPath, false, 0, 10, 60); } var handle = _entitySpawner.SpawnSync(resPath); AssetReleaserHelper.AddReleaserToSpawnObj(handle.GameObj, resPath, handle); return handle.GameObj; } //public async Task SpawnAsync(string resPath) //{ // if (!_entitySpawner.IsGameObjectPoolExisted(resPath)) // { // // 创建游戏对象池,销毁时间单位为秒 // _entitySpawner.CreateGameObjectPoolAsync(resPath, false, 0, 1, 60); // } // SpawnHandle handle = _entitySpawner.SpawnAsync(resPath); // await handle.Task; // AssetReleaserHelper.AddReleaserToSpawnObj(handle.GameObj, resPath, handle); // return handle.GameObj; //} public GameObject InstantiateSync(string resPath) { AssetOperationHandle handle = YooAssets.LoadAssetSync(resPath); GameObject gameObject = handle.InstantiateSync(); if(gameObject != null) { AssetReleaserHelper.AddReleaserToInstantiateObj(gameObject, resPath, handle); } else { handle.Release(); } return gameObject; } public void Restore(GameObject gameObject) { if (gameObject == null) { return; } AssetReleaser assetRestorer = gameObject.GetComponent(); if (assetRestorer != null && assetRestorer.IsSpawn) { assetRestorer.Restore(); } else { var assetReleasers = gameObject.GetComponentsInChildren(); if (assetReleasers != null && assetReleasers.Length > 0) { foreach(var t in assetReleasers) { if(t.IsSpawn) { t.Restore(); } } GameObject.Destroy(gameObject); } else { GameObject.DestroyImmediate(gameObject); } } } public void PreDraw(string resPath) { preDrawDic.TryGetValue(resPath, out var list); if(list == null) { list = new List(); preDrawDic[resPath] = list; } var t = PrefabManager.Instance.SpawnSync(resPath); t.transform.SetParent(preDrawRoot.transform, false); list.Add(t); } public GameObject GetPreDrawObj(string resPath) { preDrawDic.TryGetValue(resPath, out var list); if (list == null) { return null; } if(list.Count > 0) { int index = list.Count - 1; var t = list[index]; list.RemoveAt(index); return t; } return null; } public void CancelPreDraw(string resPath) { preDrawDic.TryGetValue(resPath, out var list); if(list != null && list.Count > 0) { int index = list.Count - 1; var t = list[index]; list.RemoveAt(index); Restore(t); } } } }