onDestroy是否调用问题(隐蔽神坑)

很简单一个例子,4种情况
4-1
node.active = true
var cls = node.addComponent(CLS)
node.destroy()
//onDestroy正常调用 没什么可说的
4-2
node.active = true
var cls = node.addComponent(CLS)
node.active = false
node.destroy()
//onDestroy正常调用 说明绑好了不显示也不怕 nice
4-3
node.active = false
var cls = node.addComponent(CLS)
node.active = true
node.destroy()
//onDestroy正常调用 说明先藏起来也不怕 nice (ps. onLoad不会调用)
4-4
node.active = false
var cls = node.addComponent(CLS)
node.destroy()
//onDestroy不调用了…

我说既然前面三种情况都调用了,索性就全部情况都调用onDestroy呗
毕竟既然用户重写了onDestroy肯定是期望它在destroy的时候被调用的!
onDestroy中往往是解除绑定逻辑,少调一次就有大问题
你们觉得呢?

问题是start调了吗?,如果start也没调,那destroy没调也还好。。

这是 Creator 和 Unity 的不同之处
Unity 如果节点没激活,Awake 不会调用,OnDestroy 却会调用。(不成对)

而 Creator onLoad 不会调用,onDestroy 也不会调用。(onLoad/onDestroy 成对)

我觉得目前 Creator 的设计会更合理。onLoad 创建资源、onDestroy 销毁资源。

1赞

没写onStart 没有验证

好吧
以前2dx里面onExit方法貌似是移除后都会调用的
虽说成对调用也有道理,但onDestroy从字面理解确实容易误会
毕竟这个节点/组件确实从isValid true变成了false

现在一些初始不显示的元素节点,是否会进入onDestroy不易预测

你说的对,其实这里 onDestroy 应该是叫做 onUnload

刚刚入坑cocos creator,请问想这类引擎细节点有提供一些相关的官方文档吗?我想先了解一下。多谢~

node.removeAllChildren(true);

node下面的子节点是否会自动去调用destroy,还是说要手动遍历去调用。

我目前在程序中测试,子节点是没有触发onDestroy的

不会调用。如果要 destroy 干嘛不直接调 destroy

:12::12::12::12::12::12::12:

那子节点被移除了,有什么方法回调吗?这个每个列表都要手动遍历下面的子节点去destroy,有点麻烦

destroyAllChildren 替代removeAllChildren吗?

那start呢?不是推荐在start里写逻辑嘛!

你可以在组件里定义 onDestroy 函数,就能拿到了

onDisable

start 写逻辑有一个问题,start执行时,节点已经被画过了。
比如:一个节点透明度255,start执行改为0,这个节点就会在屏幕上闪一下。

承認吧,就是引擎設計不合理

remove 完还有可能添加到场景中,相当于只是修改 parent。关 destroy 什么事?

1赞