当前位置:网站首页>CocosCreator+TypeScripts自己写一个对象池
CocosCreator+TypeScripts自己写一个对象池
2022-07-06 14:48:00 【卡西莫多说】
为什么需要对象池?
在运行时进行节点的创建(
cc.instantiate
)和销毁(node.destroy
)操作是非常耗费性能的,因此我们在比较复杂的场景中,通常只有在场景初始化逻辑(onLoad
)中才会进行节点的创建,在切换场景时才会进行节点的销毁。如果制作有大量敌人或子弹需要反复生成和被消灭的动作类游戏,我们要如何在游戏进行过程中随时创建和销毁节点呢?
很多人都会去官方文档去查看一下,有没有什么办法解决?官方文档关于对象池的链接:
使用对象池 · Cocos Creatorhttps://docs.cocos.com/creator/2.3/manual/zh/scripting/pooling.html?q=那么这次为大家介绍一下自己写的对象池:PoolMgr.ts
定义一个对象,将初始化的对象放到里面:
public static _dictPool: Object = {}
初始化hui对象池:
/**
* 初始化对象池
* @param count 生成的数量
* @param prefab 生成为节点的预制体
*/
public static initPool(count:number,prefab:cc.Prefab){
for (let index = 0; index < count; index++) {
let node:cc.Node = cc.instantiate(prefab);
this.setNode(node);
}
}
这个是自己写的初始化,一般在加载界面将对象初始化好,在游戏中就可以直接调用。
获取对象池中的某个对象:
/**
* 获取节点
* @param prefab 生成为节点的预制体
* @param parent 该节点的父节点
* @returns 生成或者对象池中的节点
*/
public static getNode(prefab:cc.Prefab,parent:cc.Node){
let name = prefab.name;
let node:cc.Node = null;
if(this._dictPool[name]){
let pool = this._dictPool[name];
if (pool && pool.size() > 0) {
node = pool.get();
} else {
node = cc.instantiate(prefab);
}
}
else{
let pool = new cc.NodePool();
this._dictPool[name] = pool;
node = cc.instantiate(prefab);
}
node.parent = parent;
return node;
}
回收某个对象:
/**
* 回收节点
* @param node 回收的节点
*/
public static setNode(node:cc.Node){
const name = node.name;
let pool = null;
if(this._dictPool[name]){
pool = this._dictPool[name];
}
else{
pool = new cc.NodePool();
this._dictPool[name] = pool;
}
if(pool.size() > 100){
node.destroy();
return;
}
pool.put(node);
}
使用示例:
let count:number = 10;
let path:string = "xx";
sc.load.LoadPrefab(path,(prefab:cc.Prefab)=>{
PoolMgr.initPool(count,prefab);
});
加载资源时调用初始化接口,这样就初始化了10个对应路径的预制体;
设置:
let node = PoolMgr.getNode(prefab,parent);
获取预制体,设置父节点,即可获得该节点;
回收:
PoolMgr.setNode(node);
回收节点时注意:如果对这个节点做了什么改变,比如它的旋转、缩放等,注意在再次使用时它的属性。
边栏推荐
- Memorabilia of domestic database in June 2022 - ink Sky Wheel
- Force deduction question 500, keyboard line, JS implementation
- 小程序系统更新提示,并强制小程序重启并使用新版本
- 柔性数组到底如何使用呢?
- RESNET rs: Google takes the lead in tuning RESNET, and its performance comprehensively surpasses efficientnet series | 2021 arXiv
- MySQL教程的天花板,收藏好,慢慢看
- C#实现水晶报表绑定数据并实现打印4-条形码
- 2500个常用中文字符 + 130常用中英文字符
- 2022-07-04 mysql的高性能数据库引擎stonedb在centos7.9编译及运行
- AI enterprise multi cloud storage architecture practice | Shenzhen potential technology sharing
猜你喜欢
第3章:类的加载过程(类的生命周期)详解
0 basic learning C language - digital tube
C # réalise la liaison des données du rapport Crystal et l'impression du Code à barres 4
[linear algebra] determinant of order 1.3 n
3DMax指定面贴图
Self made j-flash burning tool -- QT calls jlinkarm DLL mode
Should novice programmers memorize code?
A Mexican airliner bound for the United States was struck by lightning after taking off and then returned safely
[Digital IC hand tearing code] Verilog burr free clock switching circuit | topic | principle | design | simulation
二分图判定
随机推荐
Data processing skills (7): MATLAB reads the data in the text file TXT with mixed digital strings
墨西哥一架飞往美国的客机起飞后遭雷击 随后安全返航
BarcodeX(ActiveX打印控件) v5.3.0.80 免费版使用
anaconda安装第三方包
lora同步字设置
Netxpert xg2 helps you solve the problem of "Cabling installation and maintenance"
Support multiple API versions in flask
i. Mx6ull build boa server details and some of the problems encountered
Report on technological progress and development prospects of solid oxide fuel cells in China (2022 Edition)
extern关键字
雅思口语的具体步骤和时间安排是什么样的?
GD32F4XX串口接收中断和闲时中断配置
空结构体多大?
Applet system update prompt, and force the applet to restart and use the new version
C#實現水晶報錶綁定數據並實現打印4-條形碼
C # realizes crystal report binding data and printing 4-bar code
2021 geometry deep learning master Michael Bronstein long article analysis
Force deduction question 500, keyboard line, JS implementation
C#实现水晶报表绑定数据并实现打印4-条形码
硬件開發筆記(十): 硬件開發基本流程,制作一個USB轉RS232的模塊(九):創建CH340G/MAX232封裝庫sop-16並關聯原理圖元器件