需要版本:Unity2021
一、命名空间
using UnityEngine.Pool;
二、构造方法
public ObjectPool(Func<T> createFunc, Action<T> actionOnGet = null, Action<T> actionOnRelease = null, Action<T> actionOnDestroy = null, bool collectionCheck = true, int defaultCapacity = 10, int maxSize = 10000);
·参数列表解释
每个参数等号右边代表默认值,即第一个参数为必填项。
1.Func<T> createFunc
需填入一个带T类型返回值的方法,即自定义新建对象时的操作
2. Action<T> actionOnGet, Action<T> actionOnRelease, Action<T> actionOnDestroy
分别为出池、进池、销毁的响应事件。填入自定义方法名即可,用于拓展相应操作,比如在actionOnDestroy中通过Destroy()方法将因为池满而不能入池的对象直接删除
3.bool collectionCheck
是否在进池前检查对象是否已经存在池中
4.int defaultCapacity, int maxSize
初始容量,最大容量
三、属性
1.int CountAll
三个属性都为只读初始值为0,经测试,已知每调用一次createFunc委托该值就会+1
2.int CountActive
已知每调用一次Release()方法就会-1,Get()方法+1
3.int CountInactive
已知每调用一次Release()方法就会+1,Get()方法-1,最大值为池的最大容量
四、常用方法
1.T Get()
出池,返回一个池中对象。如果池为空,则先调用createFunc,再出池
2.void Relese(T element)
进池,将对象element加入池。如果池已达到最大容量,则不入池并触发actionOnDestroy事件
3.void Clear()
清空池
五、实例
1.代码
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Pool;
using Random = UnityEngine.Random;
public class ObjectPoolTest : MonoBehaviour
{
public Transform bornPoint;//敌人出生位置
public GameObject enemy;//存放敌人预制体
public int maxNumber = 30;//敌人最大数量
public int poolMaxSize = 20;//对象池最大容量
public int currentNumber;//显示当前存在的敌人数量
[Header("模拟触发敌人生成与销毁")]
public bool create;
public bool destroy;
//已下用于测试ObjectPool三个属性
[Header("测试")]
public int CountActive;//已知每调用一次Release方法就会-1,Get方法+1
public int CountAll;//已知每调用一次Create方法就会+1
public int CountInactive;//已知每调用一次Release方法就会+1,Get方法-1,最大值为 poolMaxSize
ObjectPool<GameObject> enemyPool;//对象池
int startNumber;//运行时场景中的敌人数量
int id = 1;//作为敌人命名编号
private void Awake()
{
//获取场景中的敌人数量
startNumber = GameObject.FindGameObjectsWithTag("Enemy").Length;
//构建对象池
enemyPool = new ObjectPool<GameObject>(Create, Get, Release, MyDestroy, true, 10, poolMaxSize);
}
public GameObject Create()
{
GameObject gameObject = Instantiate(enemy, bornPoint.position, Quaternion.identity);
gameObject.name = "敌人" + id++ + "号";
Debug.Log("池为空,新建对象" + gameObject.name);
return gameObject;
}
void Get(GameObject gameObject)
{
gameObject.transform.position = bornPoint.position;
gameObject.SetActive(true);//显示敌人
Debug.Log(gameObject.name + "出池");
}
void Release(GameObject gameObject)
{
gameObject.SetActive(false);//隐藏敌人
Debug.Log(gameObject.name + "进池");
}
void MyDestroy(GameObject gameObject)
{
Debug.Log("池已满," + gameObject.name + "被销毁");
Destroy(gameObject);
}
private void Update()
{
if (create)
{
create = false;
enemyPool.Get();
}
if (destroy)
{
destroy = false;
//获取场景中的所有显示的敌人
GameObject[] enmeys = GameObject.FindGameObjectsWithTag("Enemy");
//如果敌人不为空
if (enmeys.Length > 0)
{
//随机选出一个敌人然后删除
GameObject enemy = enmeys[Random.Range(0, enmeys.Length)];
enemyPool.Release(enemy);
}
}
//更新数据
CountAll = enemyPool.CountAll;
CountActive = enemyPool.CountActive;
CountInactive = enemyPool.CountInactive;
currentNumber = startNumber + CountActive;
}
}
2.场景搭建
3.运行
通过勾选脚本中的Create、Destroy来模拟敌人创建与销毁操作,同时观察脚本数据变化与控制台输出内容
文章来源:https://www.toymoban.com/news/detail-471757.html
文章来源地址https://www.toymoban.com/news/detail-471757.html
到了这里,关于Unity官方对象池ObjectPool的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!