关于setSiblingIndex的问题

  • Creator 版本: 2.0.4

  • 目标平台: web/android/ios

  • 重现方式:不断试

一开始我有一组节点,这组节点都来自同一个预制体,这组节点来自对象池。
他们的name分别为a、b、c、d、e、f、g、h、i、j,
他们被顺序添加到同一个父节点下,该父节点上有个Layout,水平排列,从左到右。添加方式是addChild(),并没有设置siblingIndex,也就是自动生成的。然后打印他们的name和siblingIndex和_localZOrder构成:name_siblingIndex__localZOrder,这组值为:

    a_0_205843
    b_1_205844
    c_2_205845
    d_3_205846
    e_4_205847
    f_5_205848
    g_6_140313
    h_7_140314
    i_8_205851
    j_9_205852

其中g节点和h节点的_localZOrder存在了问题。
正常情况下,g节点和h节点的_localZOrder应当为:205849、205850,这里为什么变成了更小的值,以至于在显示上,g节点和h节点被显示到了最左侧。

这个问题需要不断地回收节点,创建节点并排序,才会偶发。这些子节点的_localZOrder值也会随着每次新添加到父节点下后不断增大。

在以上问题的基础上,我对每个节点重新设置了siblingIndex

for (var i = 0; i < list.length; i++) {
        const node = list[i].node;
        node.setSiblingIndex(i);
    }

还是按照上面一样的构成输出,结果还是:

    a_0_205843
    b_1_205844
    c_2_205845
    d_3_205846
    e_4_205847
    f_5_205848
    g_6_140313
    h_7_140314
    i_8_205851
    j_9_205852

假如我直接修改_localZOrder,有时候会修改成功,有时候也会失效。

ChatGPT:

根据您的描述,问题似乎涉及到节点的 _localZOrder 值出现异常,导致在 Layout 中的排列顺序不正确。这可能是由于节点的创建、回收和排序导致的问题。为了解决这个问题,您可以尝试以下几种方法:

  1. 清空节点的对象池: 在需要回收和创建节点时,确保清空节点的对象池。这可以帮助避免节点在回收和创建过程中的潜在问题。例如:

javascriptCopy code

// 清空节点的对象池
cc.pool.clear(nodePrefab);
  1. 手动设置 _localZOrder 值: 在创建节点后,手动设置节点的 _localZOrder 值,确保它们按照预期的顺序排列。例如:

javascriptCopy code

for (var i = 0; i < list.length; i++) {
    const node = list[i].node;
    node._localZOrder = 205843 + i;
}
  1. 刷新 Layout: 如果您尝试手动设置 _localZOrder 值后仍然遇到问题,尝试在操作后手动刷新 Layout 组件,以确保子节点按照新的 _localZOrder 值重新排列。例如:

javascriptCopy code

parentLayout.updateLayout();

这些方法应该有助于解决您遇到的问题。如果问题仍然存在,可能需要更深入地检查代码以找到问题的根本原因。

1.updateLayout是没有任何用的,我都是用的_doLayout()
2.即使修改_localZOrder,甚至修改zIndex,都不起作用,次数多了,还是会偶发出错。