| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 | 
							- using GFGGame.Launcher;
 
- using System.Threading.Tasks;
 
- using UniFramework.Pooling;
 
- using UnityEngine;
 
- using YooAsset;
 
- using System.Collections.Generic;
 
- namespace GFGGame
 
- {
 
-     public class PrefabManager : SingletonMonoBase<PrefabManager>
 
-     {
 
-         private Spawner _entitySpawner;
 
-         private GameObject preDrawRoot;
 
-         private Dictionary<string, List<GameObject>> preDrawDic = new Dictionary<string, List<GameObject>>();
 
-         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<GameObject> 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<GameObject>(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<AssetReleaser>(); 
 
-             if (assetRestorer != null && assetRestorer.IsSpawn)
 
-             {
 
-                 assetRestorer.Restore();
 
-             }
 
-             else
 
-             {
 
-                 var assetReleasers = gameObject.GetComponentsInChildren<AssetReleaser>();
 
-                 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<GameObject>();
 
-                 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);
 
-             }
 
-         }
 
-     }
 
- }
 
 
  |