当前位置: 首页 > news >正文

淘宝导购网站备案橙子建站官网

淘宝导购网站备案,橙子建站官网,如何建设社交网站,网站规划与建设介绍 是什么? 在开始时初始化若干对象,将它们存到对象池中。需要使用的时候从对象池中取出,使用完后重新放回对象池中。 优点 可以避免频繁创建和销毁对象带来性能消耗。 适用场景 如果需要对某种对象进行频繁创建和销毁时,例…

介绍

是什么?

在开始时初始化若干对象,将它们存到对象池中。需要使用的时候从对象池中取出,使用完后重新放回对象池中。

优点

可以避免频繁创建和销毁对象带来性能消耗。

适用场景

如果需要对某种对象进行频繁创建和销毁时,例如应用在发射子弹、多个敌人创建等

代码逻辑

Unity中实现思路

1、设定初始化数量,创建List列表作为对象池容器。

2、初始化时通过Instantiate方法根据指定数量实例化一批对象,并存入List容器中。

3、使用时从容器中取出一个可用对象并SetActive(true),取出后从容器中移除。

4、使用完毕后,将对象SetActive(false),并重新放回List容器中。

主要方法

//初始化对象池
private void InitPool()
{}//创建单个对象池中的对象
private GameObject CreatePoolCell()
{}//从对象池中取出可用对象
private GameObject GetObjectFromPool()
{}//将对象放回对象池中
private void BackObjectToPool(GameObject obj)
{}//删除对象池
private void DestroyObjectPool()
{}

示例代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Test : MonoBehaviour
{public GameObject template;public Transform parentRoot;public Transform newRoot;private List<GameObject> objectPool;private int initCount;//对象池初始化的数量void Start(){InitPool();}void Update(){if (Input.GetKeyDown(KeyCode.Space)){var obj = GetObjectFromPool();ResetLocalPos(obj, newRoot);StartCoroutine(Check1(obj));}}IEnumerator Check1(GameObject obj){yield return new WaitForSeconds(5f);BackObjectToPool(obj);}#region 对象池逻辑//初始化对象池private void InitPool(){initCount = 10;objectPool = new List<GameObject>();for (var i = 0; i < initCount; i++){var obj = CreatePoolCell();objectPool.Add(obj);}}//创建单个对象池中的对象private GameObject CreatePoolCell(){var obj = Instantiate(template, parentRoot);obj.SetActive(false);obj.transform.localPosition = Vector3.zero;return obj;}//从对象池中取出可用对象private GameObject GetObjectFromPool(){for (var i = 0; i < objectPool.Count; i++){var obj = objectPool[i];if (!obj.activeInHierarchy){obj.SetActive(true);objectPool.Remove(obj);return obj;}}var newObj = CreatePoolCell();newObj.SetActive(true);return newObj;}//将对象放回对象池中private void BackObjectToPool(GameObject obj){if (objectPool.Contains(obj)){return;}obj.SetActive(false);ResetLocalPos(obj, parentRoot);objectPool.Add(obj);}//删除对象池private void DestroyObjectPool(){foreach (var iconObj in objectPool){DestroyImmediate(iconObj);}objectPool.Clear();}private void ResetLocalPos(GameObject obj,Transform parent){var trans = obj.transform;trans.SetParent(parent);trans.localPosition = Vector3.zero;}#endregion
}

Unity自带对象池

构造函数

//将会在创建新对象的时侯调用
Func<T> createFunc,    //会在从池子获取对象的时侯调用
Action<T> actionOnGet = null,  //将对象放回池子里的时侯调用
Action<T> actionOnRelease = null,  //会在彻底销毁对象的时侯调用
Action<T> actionOnDestroy = null,  //安全检查,防止将已经回收过的对象进行再一次的重复回收,默认参数的true即可
bool collectionCheck = true,    //池子初始的默认大小,会在初始化时创建一个该容量大小的 stack
//需要根据自己项目的实际需求去权衡一下初始容量的大小。
int defaultCapacity = 10,//主要是防止对象池内存过量增长,限定的对象池内最大可容纳的对象数量,
//如果池子超出了这个大小,接下来的回收对象将不会回到对象池
//而是直接调用它的 actionOnDestroy 回调进行销毁操作。
int maxSize = 10000)

主要属性和方法

接口

类型

描述

CountActive

属性

正在使用(即被激活的)的对象数量

CountInactive

属性

可以重用的对象数量

CountAll

属性

正在使用的对象和可以重用的对象的总数量

Get

方法

从对象池中获取对象

Release

方法

将对象放回池子中

Clear

方法

清理对象池

示例代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Pool;public class Test : MonoBehaviour
{public GameObject template;public Transform parentRoot;public Transform newRoot;private List<GameObject> objectPool;private int initCount;//对象池初始化的数量private ObjectPool<GameObject> testPool;public bool useObjectPool;void Start(){testPool = new ObjectPool<GameObject>(() =>{//createFunc//将会在创建新对象的时侯调用var obj = Instantiate(template, parentRoot);obj.SetActive(false);obj.transform.localPosition = Vector3.zero;return obj;},(go) =>{// actionOnGet // 会在通过池子获取对象的时侯调用,go.SetActive(true);var trans = go.transform;trans.SetParent(newRoot);trans.localPosition = Random.insideUnitSphere;},(go) =>{// actionOnRelease// 在对象放回池子里的时侯调用,这里我们取消激活需要放回池中的对象go.SetActive(false);var trans = go.transform;trans.SetParent(parentRoot);trans.localPosition = Vector3.zero;},(go) =>{/* actionOnDestroy 会在彻底销毁对象的时侯调用这里直接去destroy它就可以了对象池会在你手动释放对象或者内部空间无法存储你返回的对象的时侯调用这个函数来销毁它们*/Destroy(go); });}void Update(){if (Input.GetKeyDown(KeyCode.Space)){var obj = testPool.Get();StartCoroutine(Check1(obj));}}IEnumerator Check1(GameObject obj){yield return new WaitForSeconds(5f);testPool.Release(obj);}
}

其他类型的对象池

http://www.zhongyajixie.com/news/15171.html

相关文章:

  • 美妆网站设计模板东莞做网站的公司有哪些
  • 做论坛网站看什么书优化外包哪里好
  • 杭州建设网站制作西安网约车
  • 做网站主流用什么语言网络推广员工作内容
  • 信誉好的o2o网站建设世界疫情最新数据
  • 定制化网站开发图片seo优化是什么意思
  • 网站公安备案电话号码下载app到手机上并安装
  • 邯山区建设局网站最新实时大数据
  • 做网站IP长沙seo优化首选
  • 公司网站维护建设的通知网上销售哪些平台免费
  • 网站的备案可以管几年百度权重
  • 户外广告公司seo店铺描述例子
  • 怎样建设公司网站谷歌浏览器入口
  • 重庆峰宇园林建设有限公司网站公司网站排名
  • 论坛网站制作费用青岛网络推广公司哪家好
  • 网站设计流程的步骤网络优化工程师主要负责什么工作
  • wordpress 发布站电子商务网站建设案例
  • 绍兴网站建设专业的公司自动的网站设计制作
  • 交易类网站做支付宝功能营销策划精准营销
  • 万达做的电商网站企业培训考试系统
  • 标杆网站建设百度官网入口
  • wordpress统计搜索引擎优化培训
  • 大型网站建设定制开发什么是搜索引擎优化的核心
  • 建站哪家好 discuz百度关键词查询工具免费
  • web是网站还是网页济南专业做网站
  • 搞一个网站需要多少钱网络营销公司做什么
  • 岳阳做网站的公司福建seo推广方案
  • seo优化 div css_网站架构优化网站seo优化课程
  • 如何建立自己的陕西seo快速排名
  • 汝州网站建设营销渠道的三个类型