微信小游戏开发之js脚本访问节点和组件方式选择

主题

js脚本中如何获取节点的实例化对象,获得组件通过编辑器挂载方式,还是cc.find()方式呢,那个性能好?

特别说明

CocosCreator微信小游戏开发系列文章,是我在逐步开发过程中,基于官方文档之上,记录一些重点内容,以及对官方文档中有些知识点的补充和分析。

正文

这是一段来自CocosCreator官方文档的说明,容易被忽略,我划个重点。

Cocos Creator 的工作流程是以组件式开发为核心的,简单的说,就是以组合而非继承的方式进行实体的构建。
在 Cocos Creator 中,节点(Node) 是承载组件的实体,我们通过将具有各种功能的“组件(Component)”挂载到节点上,来让节点具有各式各样的表现和功能。

这段话简单明了的指出了CocosCreator场景布局的中心思想:由一个或多个具有UI组件能力、渲染能力、脚本等组建特性的Node节点堆叠组成的界面。

脚本组件,是负责场景中根据业务需要来处理节点组件的动态加载、刷新和后台网络请求等事务的组件,要在脚本中更新和动态加载组件,就得先获得节点和组件的实例化对象,那如何高性能的获得节点和组件呢?

在Cocos社区有一篇大神性能分析的文章:解读 Cocos Creator 引擎:让实例化快 50% 的原理,“拖节点”性能会更好吗?

这篇文章分析了“实例化”原理,给出了一些性能优化的建议。下面是结合这篇文章和其他资料,个人对获得组件的方式的一点看法。

获得节点或组件的两种方式:
  1. 在“属性检查器”设置节点或组件,拖动层级管理器上的节点,到脚本组件上对应的属性即可
cc.Class({
    extends: cc.Component,
    properties: {
        // 声明 player 属性
        player: {
            default: null,
            type: cc.Node
        }
    },
});
  1. 在脚本中通过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,以类的概念来理解,作为模块化的基础

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章