3.6 UITransform的priority属性不能用了,新的方案是什么?

我给你解析一下这句话:你的目的是“能用setSiblingIndex实现的就不需要用zIndex”,你的条件是“换成setSiblingIndex还是要封装性能也没提高反而代码多了”,我针对你的条件进行了解释说明,反驳了你的目的,你为什么还没有明白呢

真的是,谁都可以搞阅读理解了

我说的是能直接setSiblingIndex实现的功能,就不需要用zIndex,而你反驳的意思是我用setSiblingIndex封装了个类似zIndex功能的接口,实际上还是用的setSiblingIndex,我可以借用你之前说的话,你可以升级下编程原理。

我封装了setSiblingIndex,当然是为了更易用。按照你的说话。我每个用到zIndex功能的地方。都需要重复封装setSiblingIndex,然后再使用,麻烦想想自己是学习面对对象的

永远不服输,永远不知错。你说的是

是的,我可能需要给没懂的人解释下。我说的是直接用setSiblingIndex可以实现的功能模块。而不是封装setSiblingIndex后再用封装的接口实现的,对于必须要用到zIndex功能的场景。请问你是怎么实现的?

永远不服输我觉得你在说自己

用编辑器排序的

那我要动态使用呢?比如地下城与勇士这样的游戏

parent=xxxnode

你是没做过这样的游戏是吧?看到你这个回复我就不会再回复了

请你更新一下编程思想

你先顺着想,想不出正确的,再说它错

今年看到的最大笑话,用父节点控制层级来实现地下城与勇士这样的游戏

1赞

parent本身就是一种排序,之前引擎没有实现parent排序,现在实现了不是更方便了

这是笑话吗@jare

diff --git a/cocos/2d/framework/ui-transform.ts b/cocos/2d/framework/ui-transform.ts
index 4be2516f7..dfab34062 100644
--- a/cocos/2d/framework/ui-transform.ts
+++ b/cocos/2d/framework/ui-transform.ts
@@ -729,9 +729,10 @@ export class UITransform extends Component {
         }
     }
 
-    private static _sortChildrenSibling (node) {
+    private static _sortChildrenSibling (node: Node) {
         const siblings = node.children;
         if (siblings) {
+            // @ts-expect-error
             siblings.sort((a:Node, b:Node) => {
                 const aComp = a._uiProps.uiTransformComp;
                 const bComp = b._uiProps.uiTransformComp;
@@ -741,6 +742,9 @@ export class UITransform extends Component {
                 if (diff === 0) return a.getSiblingIndex() - b.getSiblingIndex();
                 return diff;
             });
+            for (let i = 0; i < siblings.length; ++i) {
+                siblings[i].setSiblingIndex(i);
+            }
         }
     }

我站你队,我就是部落冲突类型的游戏,强烈需要zIndex排序的,跟你杠的这个人,他就不知道假如45度2D游戏,战斗中实现士兵在地图中Y轴上下移动时刻改变层级时,使用setsiblingIndex是如何糟心烂肺的开发体验

哈哈,你每个帖子都要回复一下吗?在官方不太会改的情况下,只能自己封装下了

为了性能考虑,没有每个都排序,只改了当前变化的那个,且变化的这个已经加到了父节点

https://gitee.com/dream93/scl/blob/main/SCL.ts

2赞

请参考 3.7 setSiblingIndex 如何实现zindex
做引擎的人都是做过游戏的,这个无需多虑。

这个方案并不算好,设置一次sibling就for一次,尽管只排序当前Node,对于没有JIT加持的IOS也是一笔开销。
最好的方案是 在设定的帧数范围内,无论怎么修改zindex,达到设定帧数后,才执行一次整体刷新,比如每一秒 全局刷一次zIndex。这样才能应对大场景zIndex排序。
而setsibling只要调用,就会触发引擎的for循环等一系列排序的吧?没看setsibling的引擎代码,想象应该只要调用即触发排序。而且我也能想到,引擎一定没有提供整体刷新渲染顺序的接口,依然是单接口打天下。
之前因2.2 zindex性能不行,自己写过一次zindex,就是时间范围内怎么改都只做记录,最后才批量刷新zindex,后来官方优化了zindex性能,于是就不再用自己写的。
这3.x又开始唱setsibling,我是实在怕了,就想拿来就用就行了,因为我日常要开发、维护、策划、还要当客服,真的不想在某些地方钻研优化了,因为花了很多时间,做的还是之前已经做过的事,很不出活,关键是setsibling并不会带来多大的性能提升。
我是怕了,真的怕了

之前2.x有个版本zindex性能不佳,自己写了一个优化方式,即每x秒内,所有的zindex不真实奏效,只记录,达到设定时间后,整体刷新一次,也是修改引擎的方式实现的。
直到后来官方优化了zindex性能,我觉得性能表现挺优秀了,不会拖油瓶,所以我转变了想法,觉得某些地方还是官方最为擅长,因为自己写用了好几天一星期的时间,而官方的优化会让代码更规整,不凌乱,升级版本也无需再去调整引擎代码,直接升就行。我一直认为想做长久的游戏,所使用的引擎版本也必须时刻保持着更新。
无论是zindex,还是UITransform,我觉得转变的是引擎团队的设计理念,2.x时想的,是给保姆级的开发体验,毕竟小游戏居多,现在3.x所追求的,是3a,是大作,如果依然保姆级,对某些专业3a团队来说可能会显得臃肿。
但不能不管我们小制作人啊! [哭唧唧]

1赞