热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

详解cocoscreater预制体prefab

这篇文章主要介绍了详解cocoscreater预制体prefab的作用和使用方法,对此感兴趣的同学,可以回去试一试

预制体prefab

什么是预制体,字面意思,还未使用前预先制作好的节点资源,属性等同于普通节点,可以看做一个预先制作还没展示出来的普通的节点

怎么创建预制体

1.在层级管理器处先创建普通的节点,然后把这个节点拖拽到资源管理器的assets文件夹下,出于方便管理会统一建立一个Prefab文件夹下统一存放预制体

双击预制体节点可以看到它呈现蓝色,这时候就可以删除还留在场景场景里的节点,需要使用该节点时,通过预制体创建

这时候可以看到属性检查器里的属性,和普通节点一致

预制体的作用

1.批量创建相同类型的节点

本质上来说就是使用预制体创建一个模板,然后通过复制这个预制体模板批量创建

第一步:批量创建节点放入对象池

 @property(cc.Prefab)
 prefab:cc.Prefab = null;
 // 在属性管理器上声明一个预制体类型,用于在属性管理器里挂载定义好的预制体
 
 @property(cc.NodePool)
 nodePools:cc.NodePool = null;
 // 声明一个对象池用于存放通过预制体创建对象,一次性使用预制体创建足够用的相同类型节点,然后放入对象池,需要使用时拿出来,不需要时放回,避免长时间大量创建和销毁节点

 for(let i:number = 0; i <100; i++){
 	//创建100个节点
 	let node:cc.Node = cc.instantiate(this.prefab); 
    this.nodePools.put(node); 
    // 将每个节点放入对象池
 }

第二步:需要使用时直接拿出使用即可

let node:cc.Node = null;
// 判断对象池内是否有有闲置对象
if(this.nodePools.size() > 0){
	  // 使用get方法获取闲置对象,这时候把存放批量创建节点的对象池nodePools当作参数传入get里,之后可以在预制体绑定的脚本内(假设是nodePrefab.ts),进行放回对象池操作
      node = this.nodePools.get(this.nodePools);
}else{
	 // 如果没有闲置对象就通过预制体创建
      node = cc.instantiate(this.prefab);
}
//  挂载到父节点上,等同于手动拖拽挂载
    this.node.addChild(node);

第三步:使用完之后返还节点

// 假设这是上面提到的预制体脚本nodePrefab.ts脚本

nodePools:cc.NodePool = null;
// 上面通过 node = this.nodePools.get(this.nodePools); 取出对象池内的节点之后,在预制体的脚本内先定义一个对象池接收上面通过get传入的对象池

/*这样当使用 nodePool.get() 获取节点后,
就会调用预制体脚本 nodePrefab.ts 里的 reuse 方法,完成点击事件的注册。
另外 cc.NodePool.get() 可以传入任意数量类型的参数,这些参数会被原样传递给 reuse 方法*/
// 所有我们要在实现一个reuse系统回调方法
 reuse(EnemyPools:cc.NodePool) {
 		//  获取到get 中传入的管理类实例
        this.EnemyPools = EnemyPools;
 }
 
// 写一个回收对象的函数 
hit () {
	// 判断对象池是否存在
    if(this.nodePools){
    	// 存在放回当前节点
    	this.nodePools.put(this.node);
    }else{
    	// 否则直接销毁节点
      	this.node.destroy();
    }
}

2.提前制作一些特定时机才需要展示出来的节点

比如提示框之类的

 // 创建一个预制体用于属性检查器里挂载定义好的预制体
 @property(cc.Prefab)
  testPrefab:cc.Prefab = null;
	
	// 需要展示这个节点的时候直接像上面一样复制通预制体创建
	let node = cc.instantiate(this.testPrefab);
	// 挂载到父节点上
    this.node.addChild(node);
    

上面都是使用挂载,下面使用一种动态加载,这样可以不通过 @property(cc.Prefab)这样的挂载方式,就能加载出

// 因为下面的回调函数无法使用this,所以要定义一个变量传入this
let m_this = this;
/* 使用cc.loader.loadRes动态加载 Prefab,先在在assets文件夹下创建一个resources文件夹,然后把预制体资源放到下面
第一个参数是resources下面预制体的绝对路径,这样预制体就会被获取到第二个function类型参数的prefab参数里*/
[cocos文档官网](https://docs.cocos.com/creator/manual/zh/scripting/load-assets.html&#63;h=assets)
cc.loader.loadRes("assets/OptionBox", function (err, prefab) {
if(!prefab){
    cc.log("预制体为空");
}
var newNode = cc.instantiate(prefab);
if(!newNode){
    cc.log("节点为空");
}
// 添加为当前节点的子节点
m_this.node.addChild(newNode);

以上就是两种常规使用预制体的方案,例如批量创建敌人,子弹使用的是第一种,第二种在有反复使用的场景,或者特定情况触发的提示框也可以做成预制体

以上就是详解cocoscreater预制体prefab的详细内容,更多关于cocoscreater prefab的资料请关注其它相关文章!


推荐阅读
  • 阿里Treebased Deep Match(TDM) 学习笔记及技术发展回顾
    本文介绍了阿里Treebased Deep Match(TDM)的学习笔记,同时回顾了工业界技术发展的几代演进。从基于统计的启发式规则方法到基于内积模型的向量检索方法,再到引入复杂深度学习模型的下一代匹配技术。文章详细解释了基于统计的启发式规则方法和基于内积模型的向量检索方法的原理和应用,并介绍了TDM的背景和优势。最后,文章提到了向量距离和基于向量聚类的索引结构对于加速匹配效率的作用。本文对于理解TDM的学习过程和了解匹配技术的发展具有重要意义。 ... [详细]
  • Lodop中特殊符号打印设计和预览样式不同的问题解析
    本文主要解析了在Lodop中使用特殊符号打印设计和预览样式不同的问题。由于调用的本机ie引擎版本可能不同,导致在不同浏览器下样式解析不同。同时,未指定文字字体和样式设置也会导致打印设计和预览的差异。文章提出了通过指定具体字体和样式来解决问题的方法,并强调了以打印预览和虚拟打印机测试为准。 ... [详细]
  • Final关键字的含义及用法详解
    本文详细介绍了Java中final关键字的含义和用法。final关键字可以修饰非抽象类、非抽象类成员方法和变量。final类不能被继承,final类中的方法默认是final的。final方法不能被子类的方法覆盖,但可以被继承。final成员变量表示常量,只能被赋值一次,赋值后值不再改变。文章还讨论了final类和final方法的应用场景,以及使用final方法的两个原因:锁定方法防止修改和提高执行效率。 ... [详细]
  • 本文介绍了求解gcdexgcd斐蜀定理的迭代法和递归法,并解释了exgcd的概念和应用。exgcd是指对于不完全为0的非负整数a和b,gcd(a,b)表示a和b的最大公约数,必然存在整数对x和y,使得gcd(a,b)=ax+by。此外,本文还给出了相应的代码示例。 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 电销机器人作为一种人工智能技术载体,可以帮助企业提升电销效率并节省人工成本。然而,电销机器人市场缺乏统一的市场准入标准,产品品质良莠不齐。创业者在代理或购买电销机器人时应注意谨防用录音冒充真人语音通话以及宣传技术与实际效果不符的情况。选择电销机器人时需要考察公司资质和产品品质,尤其要关注语音识别率。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 如何去除Win7快捷方式的箭头
    本文介绍了如何去除Win7快捷方式的箭头的方法,通过生成一个透明的ico图标并将其命名为Empty.ico,将图标复制到windows目录下,并导入注册表,即可去除箭头。这样做可以改善默认快捷方式的外观,提升桌面整洁度。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 使用nodejs爬取b站番剧数据,计算最佳追番推荐
    本文介绍了如何使用nodejs爬取b站番剧数据,并通过计算得出最佳追番推荐。通过调用相关接口获取番剧数据和评分数据,以及使用相应的算法进行计算。该方法可以帮助用户找到适合自己的番剧进行观看。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
author-avatar
leban
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有