关于Cocos Creator脚本执行顺序的几点补充

Cocos Creator开发远非初看起来那么容易,正早一些可视化开发语言,例如VB,入门很容易,但进入实战阶段,你很可能会发现问题一股脑儿出现。但是,不要怕,根本原因还在于你不熟悉它。其效率不必怀疑,而且官方的主打产品也正是它。开发中,深感官方关于Cocos Creator脚本执行顺序尚存在很多不详细或者透彻的地方;因此,本人结合最近一个时段的学习,作以下几点补充。

一,官方文档最重要

地址是:http://docs.cocos.com/creator/manual/zh/scripting/execution-order.html
但是,其中提倡使用统一的控制脚本来初始化其他脚本这一部分尚有一些疑点,例如官方给出的示例代码是:

// Game.js

const Player = require(‘Player‘);
const Enemy = require(‘Enemy‘);
const Menu = require(‘Menu‘);

cc.Class({
    extends: cc.Component,
    properties: {
        player: Player,
        enemy: Enemy,
        menu: Menu
    },

    onLoad: function () {
        this.player.init();
        this.enemy.init();
        this.menu.init();
    }
});

但是,当三个脚本Player.js,Enemy.js和Menu.js分别挂载到一些UI组件上时,这个Game.js本身挂载到哪里?只是简单地创建一个与最外层Canvas同级的空节点上并把它挂载到上面去吗?通过我的试验分析,这是存在问题的。

二、同一节点上脚本的执行顺序

官方的结论是:
“在同一个节点上的组件脚本执行顺序,可以通过组件在 属性检查器 里的排列顺序来控制。排列在上的组件会先于排列在下的组件执行。我们可以通过组件右上角的齿轮按钮里的 Move Up 和 Move Down 菜单来调整组件的排列顺序和执行顺序。”
这个没有什么可值得怀疑的,也很好理解。

三、后代节点上挂载的脚本的执行时机

若某节点是父节点,其下有一个子节点,且这父子节点都各自挂载一些脚本,则执行顺序是先执行父节点上的脚本(可能有多个),再执行子节点上的脚本。

四、兄弟节点上挂载的脚本的执行顺序

此种情况下,按照自上而下的顺序执行各节点上挂载的脚本代码。

五、一般情形下挂载脚本执行顺序

若有如下所示的节点及脚本的挂载结构图:

Canvas1(本身挂载有S1.JS脚本)
其下有子节点BALL(此节点挂载有S11.JS脚本)
Game(本身挂载有S2.JS脚本)
其下有子节点PLATFORM(此节点挂载有S21.JS脚本)

于是,根据上面分析有下面的脚本执行顺序:
S1.JS S11.JS S2.JS S21.JS

六、非使用cc.Class定义的非继承自cc.Component脚本文件的执行时机

例如脚本文件Physics-Settings.js:

console.info("I am here...");
let physicsManager = cc.director.getPhysicsManager();
physicsManager.enabled = true;

physicsManager.debugDrawFlags =
    // 0;
    // cc.PhysicsManager.DrawBits.e_aabbBit |
    cc.PhysicsManager.DrawBits.e_jointBit |
    cc.PhysicsManager.DrawBits.e_shapeBit
    ;

此脚本的加载非常之早,在所有软件自定义脚本的开发之前加载,有下图为证:

因此,由上图可见,程序中所有脚本的加载顺序为:

Cocos2d 引擎
插件脚本(有多个的话按项目中的路径字母顺序依次加载)
普通脚本(打包后只有一个文件,内部按 require 的依赖顺序依次初始化)

七、小结

Cocos Creator入门容易,深入掌握也不易,但随着官方提供支持的不断丰富,相信会进一步简化我们的学习。有关JS脚本开发技术,更是Cocos Creator开发中的重中之重,随着对这个工具的不断深入,需要我们也不断深入掌握JS开发技术。本文仅是本人近期一个BOX2D类小游戏开发过程中结合自己使用总结出的一点小体会,不当处还希望各位多多批评。

原文地址:http://blog.51cto.com/zhuxianzhong/2092267

时间: 2024-12-22 12:38:07

关于Cocos Creator脚本执行顺序的几点补充的相关文章

unity脚本执行顺序

Awake ->OnEable-> Start ->-> FixedUpdate-> Update  -> LateUpdate ->OnGUI ->Reset -> OnDisable ->OnDestroy using UnityEngine; using System.Collections; public class timetest : MonoBehaviour { void LateUpdate() { print("La

unity脚本执行顺序详解

unity脚本自带函数执行顺序如下:将下面脚本挂在任意物体运行即可得到 Awake ->OnEable-> Start ->-> FixedUpdate-> Update  -> LateUpdate ->OnGUI ->Reset -> OnDisable ->OnDestroy using UnityEngine; using System.Collections; public class timetest : MonoBehaviour

Unity3d脚本执行顺序详解

欢迎来到unity学习.unity培训.unity企业培训教育专区,这里有很多U3D资源.U3D培训视频.U3D教程.U3D常见问题.U3D项目源码,我们致力于打造业内unity3d培训.学习第一品牌. 在调用脚本的时候遇到下面报错情况: NullReferenceException: Object reference not set to an instance of an object 意思就是:未将对象引用设置到对象的实例脚本内部的 Start()函数并不能作为构造的形式,因为在同一个对象

Unity脚本执行顺序自研框架

本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/52372611 作者:cartzhang 一.关于Unity脚本执行排序 1 Unity脚本执行排序的说明 在Unity中,要控制Unity的脚本执行顺序,Unity引擎本身已经有了一个脚本排序.这个排序在编辑器中可以编辑并设置. 它里面带有默认的,根据优先级来排定执行顺序.若没有在排序的均在default time排序的间隙

Cocos Creator 脚本模板

1.由于新建Cocos Creator脚本带有很多注释,并且有时候需要增加定制的默认注释,所以需要修改脚本生成模板. 2.在CocosCreator\resources\static\template目录下,找到new-script.js/new-script.ts并进行修改.

脚本执行顺序

一般的,建议在Awake方法中创建游戏对象或Resources.Load(Prefab)对象,然后在Start方法中去获取游戏对象或者组件,因为事件函数的执行顺序是固定的,这样就可以确保万无一失了. 另外,Unity也提供了一个方法来设置脚本的执行顺序,在Edit -> Project Settings -> Script Execution Order菜单项中,可以在Inspector面板设置 点击右下角的"+"将弹出下拉窗口,包括游戏中的所有脚本.脚本添加完毕后,可以用

html解析和渲染过程 与 Script标签和脚本执行顺序

几个首要特性: script标签(不带defer或async属性)的会阻止文档渲染.相关脚本会立即下载并执行. document.currentScript可以获得当前正在运行的脚本(Chrome 29+, FF4+) 脚本顺序再默认情况下和script标签出现的顺序一致 有defer或async属性(defer和async没有完全兼容所有浏览器) 仅有async属性,脚本会异步执行 仅有defer属性,脚本会在文档解析完毕后执行 两个属性都没有,脚本会被同步下载并执行(顺序下载,顺序执行),期

unity 脚本执行顺序设置 Script Execution Order Settings

通过Edit->Project Settings->Script Execution Order打开MonoManager面板 或者选择任意脚本在Inspector视图中点击Execution Order..按钮 Default Time下方数值越小的排在越前面脚本将率先执行.

Cocos Creator脚本开发事例

HelloWorld.js 1 window.Global = { 2 gint: 168, 3 }; 4 cc.Class({ 5 extends: cc.Component, 6 7 properties: { 8 label: { 9 default: null, 10 type: cc.Label 11 }, 12 // defaults, set visually when attaching this script to the Canvas 13 text: 'Hello, Wor