using UnityEngine; using System.Collections; using System.Collections.Generic; using Game; using UnityEditor; using Axibug.Resources; public enum E_PREFAB_TYPE { NONE, EFFECT, } // 局部对象池模板 public class PrefabPool where T : MonoBehaviour { private Transform mb_vParentTf; // 创建对象时的父节点 private List mb_vObjList; // 对象列表 private string mb_vPrefabPath; // 对象预制名称 private E_PREFAB_TYPE mb_vPrefabType; public int iActivityCount { get { int retCount = 0; if (mb_vObjList != null) { for (int i = 0; i < mb_vObjList.Count; i++) { if (mb_vObjList[i].gameObject.activeSelf) retCount++; } } return retCount; } } public List vObjList { get { if (mb_vObjList == null) mb_vObjList = new List(); return mb_vObjList; } } // 默认构造 需要配合 Init()使用 public PrefabPool() { } // 构造 并 Init() public PrefabPool(Transform tfParent, E_PREFAB_TYPE type) { string vPrefabName = typeof(T).FullName; mb_vPrefabType = type; this.Init(tfParent, vPrefabName); } // 初始化 void Init(Transform tfParent, string vPrefabName) { mb_vParentTf = tfParent; switch (mb_vPrefabType) { case E_PREFAB_TYPE.EFFECT: mb_vPrefabPath = $"Assets/GameAssets/Prefabs/Effect/{vPrefabName}/{vPrefabName}.prefab"; break; } } // 隐藏 public void Hide() { for (int i = 0; i < vObjList.Count; i++) { vObjList[i].gameObject.SetActive(false); } } // 隐藏父节点 public void HideNode() { mb_vParentTf.gameObject.SetActive(false); } // 显示父节点 public void ShowNode() { mb_vParentTf.gameObject.SetActive(true); } // 获取 public T GetObj(int index) { if (index < vObjList.Count) { vObjList[index].gameObject.SetActive(true); return vObjList[index]; } GameObject go = ClonePrefab(mb_vPrefabPath, mb_vParentTf); T vObj = go.GetComponent(); if (vObj == null) vObj = go.AddComponent(); vObjList.Add(vObj); return vObj; } // 获取 public T GetAnyHide() { int count = vObjList.Count; for (int i = 0; i < count; i++) { if (!vObjList[i].gameObject.activeSelf) { vObjList[i].gameObject.SetActive(true); return vObjList[i]; } } return GetObj(count); } public void Remove(int index) { if (index >= vObjList.Count) return; T vObj = vObjList[index]; GameObject.Destroy(vObj.gameObject); vObjList.RemoveAt(index); } public void Remove(T obj) { for (int i = 0; i < vObjList.Count; i++) { if (vObjList[i] == obj) { GameObject.Destroy(obj.gameObject); vObjList.RemoveAt(i); return; } } } // 销毁 public void Destory() { for (int i = 0; i < vObjList.Count; i++) { T vObj = vObjList[i]; GameObject.Destroy(vObj.gameObject); } vObjList.Clear(); } private GameObject ClonePrefab(string path, Transform parent) { string rootPath = "Assets/GameAssets"; string MapName = path; string tmp = MapName.Remove(0, rootPath.Length + 1); int idx = tmp.LastIndexOf('/'); string bundleName = tmp.Substring(0, idx); UnityEngine.Object asset = null; if (AppEntry.Base.EditorResourceMode) { #if UNITY_EDITOR asset = AssetDatabase.LoadAssetAtPath(MapName); #endif } else { int id = MapName.GetHashCode(); asset = PrefabManager.LoadPrefab(bundleName.ToLower(), MapName, id, parent); } if (asset == null) { Debug.LogError($"asset加载失败,path={MapName}"); return null; } GameObject go = GameObject.Instantiate(asset, parent) as GameObject; if (go == null) { Debug.LogError("LoadPrefabByEditor2. go == null. asset:" + asset); } return go; } }