组件脚本的初始化阶段,我们提供了 onLoad
回调函数。onLoad
回调会在节点首次激活时触发,比如所在的场景被载入,或者所在节点被激活的情况下。在 onLoad
阶段,保证了你可以获取到场景中的其他节点,以及节点关联的资源数据。onLoad 总是会在任何 start 方法调用前执行,这能用于安排脚本的初始化顺序。通常我们会在 onLoad
阶段去做一些初始化相关的操作。
start
回调函数会在组件第一次激活前,也就是第一次执行 update
之前触发。start
通常用于初始化一些中间状态的数据,这些数据可能在 update 时会发生改变,并且被频繁的 enable 和 disable。
游戏开发的一个关键点是在每一帧渲染前更新物体的行为,状态和方位。这些更新操作通常都放在 update
回调中。
update
会在所有动画更新前执行,但如果我们要在动效(如动画、粒子、物理等)更新之后才进行一些额外操作,或者希望在所有组件的 update
都执行完之后才进行其它操作,那就需要用到 lateUpdate
回调。
当组件的 enabled
属性从 false
变为 true
时,或者所在节点的 active
属性从 false
变为 true
时,会激活 onEnable
回调。倘若节点第一次被创建且 enabled
为 true
,则会在 onLoad
之后,start
之前被调用
当组件的 enabled
属性从 true
变为 false
时,或者所在节点的 active
属性从 true
变为 false
时,会激活 onDisable
回调。
当组件或者所在节点调用了 destroy()
,则会调用 onDestroy
回调,并在当帧结束时统一回收组件。
除了通过场景编辑器创建节点外,我们也可以在脚本中动态创建节点。通过 new cc.Node()
并将它加入到场景中,可以实现整个创建过程。
有时我们希望动态的克隆场景中的已有节点,我们可以通过 cc.instantiate
方法完成。
和克隆已有节点相似,你可以设置一个预制(Prefab)并通过 cc.instantiate
生成节点
通过 node.destroy()
函数,可以销毁节点。值得一提的是,销毁节点并不会立刻被移除,而是在当前帧逻辑更新结束后,统一执行。当一个节点销毁后,该节点就处于无效状态,可以通过 cc.isValid
判断当前节点是否已经被销毁。
调用一个节点的 removeFromParent
后,它不一定就能完全从内存中释放,因为有可能由于一些逻辑上的问题,导致程序中仍然引用到了这个对象。因此如果一个节点不再使用了,请直接调用它的 destroy
而不是 removeFromParent
。destroy
不但会激活组件上的 onDestroy
,还会降低内存泄露的几率,同时减轻内存泄露时的后果。
总之,如果一个节点不再使用,destroy
就对了,不需要 removeFromParent
也不需要设置 parent
为 null
哈。