AkiraPixelWind/Assets/Scripts/Main/ObjPool/PrefabPool.cs

203 lines
4.6 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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<T> where T : MonoBehaviour
{
private Transform mb_vParentTf; // 创建对象时的父节点
private List<T> 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<T> vObjList
{
get
{
if (mb_vObjList == null)
mb_vObjList = new List<T>();
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<T>();
if (vObj == null)
vObj = go.AddComponent<T>();
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<GameObject>(MapName);
#endif
}
else
{
int id = MapName.GetHashCode();
asset = PrefabManager.LoadPrefab<UnityEngine.Object>(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;
}
}