exdev / ex2d-dev

2D framework and pipeline for Unity3D
ex-dev.com/ex2d
GNU General Public License v3.0
6 stars 3 forks source link

考虑并尝试加入node tree进行排序,方便制作2D项目。 #59

Closed jareguo closed 9 years ago

jareguo commented 10 years ago

同时考虑layer如何整合,如果那样做的话,layer其实也可以用node进行排序。

jwu commented 10 years ago

@tinytail 继续周二的讨论。我觉得 layer 还是有存在的必要的。尽管 layer 可以用 depth 表达。但是 layer 和 layer 之间的 depth 间隔往往是开发人员困惑的问题。

假设我们有 Background, Foreground 两个 layer. 拿数羊为例,开发者并不知道羊有多少只,于是他对background 和 foreground 的 depth 间隔设置了一个 200。然后每只羊在 foreground 里的depth间隔是 1.0f. 于是,就容许200只羊的上限。 而如果开发人员用 layer 去思考这个问题。他只需要设置 background, foreground 的 layer 顺序,并不用去关心 layer之间的 depth间隔。

我想,处于让开发者不困惑,我们还是应当保留layer。我觉得开发者的depth安排重心应该是专注于layer内的,这里的排序间隔是交给开发者去诠释。如上面所说的 depth 间隔 1.0。于是开发者就会根据这个间隔去调整子物体之间的关系,例如他总是设置羊的 depth 为 0.5 + n (n为羊的排序结果), 然后子物体中标签总是 0.1f, hit 效果总是 0.2f。

而对于 layer 和 layer 之间的间隔,反而是开发人员不关心的。他不会想要为我有多少 UI panel ,我UI layer的 depth该给予多少才不会和 foreground 穿插这样的事情烦恼。

jareguo commented 10 years ago

确实,layer存在的作用就是帮助开发人员减少depth的烦恼。而如果使用node tree下去表示,对用户来说depth就只有针对同一个node下的sprite有效了。不同node(羊)下的sprite(装备),不论depth如何设置总会保证按照父node进行排序。也就是说这样能够避免不同node之间的sprite发生穿插。

jwu commented 10 years ago

@tinytail node tree看起来是个不错的思路。我想知道,你如何遍历这颗树?通过 transform配合 GetComponent 还是通过在 sprite 中添加 parent, children ?前者在 GetComponent 时可能会有效率上得瓶颈,后者则会有维护上得难度。

jareguo commented 10 years ago

这个很头疼,其实这个需求,跟clip和layer挺接近的。就是需要在hierarchy改变时,进行监听。unity自带的transform.hasChanged很鸡肋,如果要多个模块同时监听,还需要有一个模块统一转发这些事件。 是否考虑新增exLayeredNode,这个组件辅助更新Depth,维护单独的一套hierarchy?

jareguo commented 10 years ago

单独一套hierarchy的好处是,不用监听unity hierarchy的改变。缺点是editor下修改起来麻烦,要好用的话可以考虑整合入2D Scene Editor或UI Layout Editor。

jwu commented 10 years ago

那样就回到了我之前的ex2D v1 的 layer manager里了。虽然这次是 layer 内部的更新,还是会产生不少问题。 我个人建议利用 transform 配合 GetComponent 这种方法会更好一些。虽然效率上有所影响,但是维护和制作流程上回更贴近实际情况。

此前 layer manager 在遇到 transform 更新,或者 prefab 安插这种情况时,会出现大量的bug,并且无法很好的解决。原因不外乎两套 hierarchy, transform 为原生的,所以用户在很多不可监听的情况下出现的改动造成 layer hierarchy 的无法重新构造它。