这是哪个版本啊,2.几的。
3.x应该没这个问题吧
2.4.12的,算是很新的版本了,3.x你们找下对应源码看看。2.x对应的是这两个文件:component-scheduler.js,mutable-forward-iterator.js
区别好像不是很大,估计是没动过这块。
哦豁,这就难受住了
跟 Unity 一样,引擎的 remove 都是一帧结束时批量调用的,不会出现你这个 case。真有这种低级错误的话早就修复了。
所以你是怎么做到,在 Update 调用的过程中移除 Component 的?把完整代码贴出来!
帖子还要审核的么
update的时候移除一个节点,节点上绑了其他comp,这不就是遍历过程中移除comp么
afk类即时战斗,同一帧多个spine特效移除添加
按理说,战斗的脚本(比如叫Fight)先添加,后续才会有特效之类Spine的添加移除,执行也是先update的Fight脚本,后面才是Fight界面里的其他组件
但是这行代码会把后面的comp移到前面去,造成Fight里面其他组件排序会在Fight脚本前面。如果Fight的update执行的时候移除了前面的特效的comp,i–,这时候就会出问题了。
不是啊,实际的移除操作是发生在当帧结束时的。如果是移到前面去,那有可能,但是 update 被调用两次时不太可能。
如果第二次update又恰好有前面的节点移除,i–,造成第三次update,极限情况就不知道一个comp会有多少次update了
你这个说的是删除过程中的遍历啊。我的意思是这个遍历和 update 的调用没关系。因为在 update 的时候根本不会走到删除,删除都是一帧结束时才统一进行的。那时候早就 update 完了。这里随便怎么遍历,都不影响到前面 update 的调用,懂?
这个函数又能有什么 bug?引擎那么多高手,连个迭代器的删除都做不到?
这个又有啥问题?移除了前面的元素,难道 i 不用左移?
你说的删除都是一帧结束后统一处理,应该指的是destory,这个确实是在一帧结束的时候统一处理
这里的删除场景,是在遍历所有comp的update过程中,其中的某个组件的update中执行了removechild操作,导致节点上绑的comp从update列表中删除
约个引擎高手过来瞅瞅吧,艾特不到人过来看
update 的过程中 removeChild,那只会 disable,不会 remove
Panda 都走了,现在引擎还有高手?
的确有点问题,一个简单的demo,挂在7个空节点上Node1-Node7
import { _decorator, Component } from 'cc';
const { ccclass, property } = _decorator;
@ccclass('Test')
export class Test extends Component {
private _frame: number = 0;
update(deltaTime: number) {
this._frame++;
if(this._frame > 5) return;
console.log("update", this.node.name, "frame:", this._frame)
if(this._frame == 2 && this.node.name == "Node4") {
this.node.parent.getChildByName("Node2").removeFromParent()
this.node.parent.getChildByName("Node1").removeFromParent()
}
}
}
删除节点的那一帧,删除前面的节点,删除了几个就会几个重复执行,同时fastRemove实际是交换位置,挪到前面的几个又少执行一次。不过这个执行太频繁了,换成正常的数组删除太慢,感觉应该还是大概率不会改。这种强定时需求的感觉还是自己封装个全局的定时器,挂在最前面的常驻节点就不会受影响。做各种加速、暂停什么的也方便