对象池笔记
封装接口:
using System.Collections;
using System.Collections.Generic;
public interface IReusable {
//取出时候调用
void OnSpawn();
//回收调用
void OnUnSpawn();
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public abstract class ReusableObject : MonoBehaviour, IReusable
{
public abstract void OnSpawn();
public abstract void OnUnSpawn();
}
子池的实现
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
public class SubPool
{
//集合
List<GameObject> m_objecs = new List<GameObject>();
//预设
GameObject m_prefab;
//父物体的位置
Transform m_parent;
//名字
public string Name
{
get
{
return m_prefab.name;
}
}
public SubPool(Transform parent, GameObject go)
{
m_prefab = go;
m_parent = parent;
}
//取出物体
public GameObject Spawn()
{
GameObject go = null;
foreach (var obj in m_objecs)
{
if (!obj.activeSelf)
{
go = obj;
}
}
if (go == null)
{
go = GameObject.Instantiate<GameObject>(m_prefab);
go.transform.parent = m_parent;
m_objecs.Add(go);
}
go.SetActive(true);
go.SendMessage("OnSpawn", SendMessageOptions.DontRequireReceiver);
return go;
}
//回收物体
public void UnSpawn(GameObject go)
{
if (Contain(go))
{
go.SendMessage("OnUnSpawn", SendMessageOptions.DontRequireReceiver);
go.SetActive(false);
}
}
//回收所有
public void UnspawnAll()
{
foreach (var obj in m_objecs)
{
if (obj.activeSelf)
{
UnSpawn(obj);
}
}
}
//判断是否属于list里边
public bool Contain(GameObject go) {
return m_objecs.Contains(go);
}
}
大池子,通过这个池子存取
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ObjectPool : MonoSingleton<ObjectPool> {
/// <summary>
/// 资源目录
/// </summary>
public string ResourceDir = "";
Dictionary<string, SubPool> m_pools = new Dictionary<string, SubPool>();
//取出物体
public GameObject Spawn(string name,Transform trans) {
SubPool pool = null;
if (!m_pools.ContainsKey(name)) {
RegieterNew(name,trans);
}
pool = m_pools[name];
return pool.Spawn();
}
//回收物体
public void Unspawn(GameObject go) {
SubPool pool = null;
foreach (var p in m_pools.Values) {
if (p.Contain(go)) {
pool = p;
break;
}
}
pool.UnSpawn(go);
}
//回收所有
public void UnspawnAll() {
foreach (var p in m_pools.Values) {
p.UnspawnAll();
}
}
//清除所有
public void Clear()
{
m_pools.Clear();
}
//新建一个池子
void RegieterNew(string names,Transform trans) {
//资源目录
string path = ResourceDir + "/" + names;
//生成预制体
GameObject go = Resources.Load<GameObject>(path);
//新建一池子
SubPool pool = new SubPool(trans ,go);
m_pools.Add(pool.Name,pool);
}
}