美文网首页Cocos CreatorCocos Creator
cocos creator 引擎是如何处理脚本的

cocos creator 引擎是如何处理脚本的

作者: 许彦峰 | 来源:发表于2019-01-04 16:36 被阅读171次

引擎如何处理js脚本

举例一个js脚本来剖析到底引擎都会我们编写的脚本做了什么工作
脚本源码为:

image ​

引擎在run过程中,会加载所有的js脚本

image ​

这里出现了nodejs里面经常提到的module.exports,

image ​
image ​

可以看到脚本源码被cc._RF进行了封装处理,而module.func来源自cc.registerModuleFunc()


image.png

换而言之,我们写的脚本源码其实在引擎run的过程,都会被执行一遍,function在js中也被认为是一个变量,所以,我们可以进一步验证我们的猜想,我们增加了如下代码


image.png
image.png
如果不出意外,那么TestFunc肯定是在第一个scene启动之前就执行了,也许你能得到一点启发,但是这种写法,不建议滥用

module.exprots / require

我们在使用脚本的时候,经常会使用require("ScriptName")来引入我们的组件脚本,那么require到底做了什么呢?追查源码发现,最终是在调用cc.require()

image.png
很熟悉的func,但是我们可以看到有m.module的判断,这个func是啥呢

也是之前很熟悉的代码,就是能执行我们js脚本的一个function,更多细节就不再说啦,可以仔细翻看源码
下边重点说说module.exports,这个东西其实是nodejs的一个设计思想,详细参考资料看这里
简而言之,每个node模块,都可以理解为一个单例,一单程序加载,是永久暂留到内存中的
那么new是怎么回事呢?为什么cc.Class要new呢?其实cc.Class返回的是function,至于在js中
new function(){
}

可以参考这篇文章: https://www.cnblogs.com/pizitai/p/6427433.html

那么require又干了什么事情呢?
可能这张图就有点复杂了,不过能帮助你真正理解require


image.png

可以看到editor环境代码其实和runtime环境代码是在一起的,用CC_EDITOR作了区分

总结

  • 以下情况建议这么编码:
    • 该脚本和界面无关
    • 单纯的逻辑脚本
    • 单例模式
    cc.moduleA = module.exports ={
      propertyA:1,
    }
    
    那么这样也是可以在任何地方直接使用cc.moduleA,因为run()的过程,已经正确加载了模块
  • 和界面有关的脚本建议使用cc.Class(),因为本身cc.Class()和引擎的关系更密切

相关文章

网友评论

    本文标题:cocos creator 引擎是如何处理脚本的

    本文链接:https://www.haomeiwen.com/subject/flhkrqtx.html