主题
js脚本中如何获取节点的实例化对象,获得组件通过编辑器挂载方式,还是cc.find()方式呢,那个性能好?
特别说明
CocosCreator微信小游戏开发系列文章,是我在逐步开发过程中,基于官方文档之上,记录一些重点内容,以及对官方文档中有些知识点的补充和分析。
正文
这是一段来自CocosCreator官方文档的说明,容易被忽略,我划个重点。
Cocos Creator 的工作流程是以组件式开发为核心的,简单的说,就是以组合而非继承的方式进行实体的构建。
在 Cocos Creator 中,节点(Node) 是承载组件的实体,我们通过将具有各种功能的“组件(Component)”挂载到节点上,来让节点具有各式各样的表现和功能。
这段话简单明了的指出了CocosCreator场景布局的中心思想:由一个或多个具有UI组件能力、渲染能力、脚本等组建特性的Node节点堆叠组成的界面。
脚本组件,是负责场景中根据业务需要来处理节点组件的动态加载、刷新和后台网络请求等事务的组件,要在脚本中更新和动态加载组件,就得先获得节点和组件的实例化对象,那如何高性能的获得节点和组件呢?
在Cocos社区有一篇大神性能分析的文章:解读 Cocos Creator 引擎:让实例化快 50% 的原理,“拖节点”性能会更好吗?
这篇文章分析了“实例化”原理,给出了一些性能优化的建议。下面是结合这篇文章和其他资料,个人对获得组件的方式的一点看法。
获得节点或组件的两种方式:
- 在“属性检查器”设置节点或组件,拖动层级管理器上的节点,到脚本组件上对应的属性即可
cc.Class({
extends: cc.Component,
properties: {
// 声明 player 属性
player: {
default: null,
type: cc.Node
}
},
});
- 在脚本中通过api(this.node.getChildByName()/cc.find())查找
cc.Class({
extends: cc.Component,
start: function () {
//查找当前节点的子节点
//var nodeList = this.node.children;
var bgNode = this.node.getChildByName("Bg");
//根据传入的路径进行逐级查找
//cc.find("Bg/StartBtn/Text", this.node);
//只传入第一个参数时,将从场景根节点开始逐级查找
//this.backNode = cc.find("Canvas/Bg/Back");
}
});
注意: getComponent()方法是获取组件实例的方法,在this.node.getComponent是获取节点的组件,和this.getComponent是等效的。
结论
场景中静态的节点,尽量都使用在“属性检查器”中设置节点或组件的方式,动态加载的节点才去采用getChildByName/cc.find。
简单说下我get到的几个点:
- 刚开始我挺纠结用那种方式获得引用实例的,当我对开发完成的场景中节点重命名后,我发现拖到属性检查器上的节点名也自动更新,而getChildByName/find的路径需要手动去改;
- getChildByName是需要遍历去查找的,cc.find同样逐级去查找,简单的看它们的性能消耗肯定更大
有哪里理解错误的,请大家即时点醒,谢谢!
结尾
自己动手写,分解项目中的各个模块需求,通过查文档和搜索Cocos社区,解决碰到的问题,最终在微信上线了下面这款微信小游戏《成语锦衣卫》,欢迎大家扫码体验,并作为参考项目模版,开发出属于自己的小游戏
预告
下一节和朋友们说一说:不继承cc.Component的cc.Class,以类的概念来理解,作为模块化的基础