建议直接跳过前两段。。。。看后面Log和结论
几个月前就接触了Cocos Creator,开始自学,零零碎碎地学到了现在,看会儿官方文档,看烦了,又找了相关的学习视频看,时间一长,也觉得腻烦。好吧,那就直接上手看Demo呗。下载了好多,有官方文档推荐的几个(抓星星、绵羊、暗黑复刻等等),Cocos社区分享的一些Demo。简单的看了几个,刚开始还挺感兴趣的,Demo改着玩(其实让我自己编就四顾茫然了),在稍复杂的,需要联网的坦克大战,那就头大了,今天看一点,明天累了不看,,,一拖再拖。直到最近,毕业了,人终于闲下来了,打算沉下心来,从头开始好好地学习Cocos Creator。
与此同时,从小到大不喜欢语文和写作的我(或者说文字表达不行)也终于下定决心开始写博客了(原本的我,认为写博客这种高大上的事情和自己是一毛钱关系没有,既没有这个能力,同时也懒,有这个时间,还不如玩几把游戏),一方面是考虑到目前在家自学效率实在低下,为了提高自学效率,听说有个正向反馈的机制,就打算每天自学结束后,写点自己的心得,记录下来,给自己一点成就感,怕自己自学从入门到入坟,哈哈!!另一方面,也可以通过写博客总结自己学到的东西,将来可以自己看看(其实也挺享受第一次写博客的体验,感觉很高大上哎)。
要是写的有什么对看到的人有帮助的话,那就最好不过了。以下仅为个人见解,有错误烦请见谅帮忙指出来,欢迎指教
今天在重温Cocos Creator官方文档学习小怪抓星星的项目过程(不知道那个项目的朋友可以看这个链接:抓星星)中,本打算尝试着完善一些功能,比如加一个play按钮,控制游戏的开始以及失败后的重新开始。由于比较懒,加上太久没碰代码了,,,改了半天,功能没完善出来,倒是被我整出了一堆Bug。正准备寻找原因的我,,这才忽然想到,我该从何找起,我连这个项目中脚本的执行顺序都不知道。。。汗颜的我开始找起了相关资料,其中官方文档(脚本执行顺序)是第一个看的,但还不够详细,解决不了我当下的问题,于是又找了别的资料,CSDN上的(对于官方的几点补充),说的挺好,我自己也试了下,基本上没问题,另外还有个人实验的一点补充。
前面乱七八糟的交代了背景,不想看的可以不看。。。实验主要如下:
game.js: 挂载于父节点的脚本
Player.js:挂载于子节点(怪物)的脚本
exampleCommon.js:挂载于子节点(试验实例)的脚本
Star.js:挂载于子节点同时也是预置资源(星星)的脚本
examplePrefab.js:挂载于子节点同时也是预置资源(试验实例)的脚本
其中,Player.js所在节点与exampleCommon.js所在节点为兄弟节点,层级管理器顺序一个在前,一个在后。如下图:
其中Star.js与examplePrefab.js属于预置资源,不在层级管理器中,在game.js的onLoad()方法中有如下代码:
通过这段代码,Star.js与examplePrefab.js所在节点也成为了Canvas的子节点,与player、exampleCommon为兄弟节点。
在以上每个js脚本的生命周期回调函数onLoad、start、update中都写了一个log,便于判断执行顺序。
结果如下:
结论:
1、父节点的脚本先执行,然后执行子节点脚本。
2、(这里先不考虑预置资源加载的子节点)同一个父节点下的子节点,即兄弟节点,按照层级管理器的排列顺序执行相应节点的脚本。
3、同一个父节点下的普通子节点和“预置子节点”(即预置资源通过父节点的onLoad()方法加载成为子节点),它们的onLoad()肯定是预置子节点先执行(原因见第一点);其他的start()和update()方法统一将预置子节点押后执行,即先执行普通子节点(这一点原因不是很清楚,是通过这次试验得到的一个粗浅结论,若有错烦请指正)。
4.同一个父节点下的预置子节点,按照父节点onLoad()中添加子节点的顺序先后执行节点上的脚本。