手册上关于层顺序的介绍基本没有,只是一个不明所以的Q&A一带而过:
层的排序是否重要?
是的。层的优先级是按顺序从上到下的。层设置为 override 将始终覆盖先前的层(如果层有遮罩,则基于其遮罩)。
基础层的权重值是否应始终设置为 1?或者在使用其他层时权重是否应为 0?
基础层权重始终为 1,覆盖层将完全覆盖基础层。
(原文:)
Does the ordering of the layers matter?
Yes. Layers are evaluated from top to bottom in order. Layers set to override will always override the previous layers (based on their mask, if they have a mask).
Should the weight value of the base layer always be set to one or should the weight be zero when using another layer?
The base layer weight is always 1 and override layers will completely override the base layer.
如何理解“优先级是按顺序从上到下”?
以及 两种混合模式 override 和 Additive 如何理解 ?
实践出真知。
实验方法:
我有一个2D角色,默认动画是 “闲置状态”(全身的动画,包含手部),在默认层 BaseLayer 。
它还有一个“开枪动作”(手部的特别动画),放在新建的动画层 arms 层。
为了明确不同混合方式达到的效果,
- 闲置状态 的动画中,我将身体变为蓝色。
- 开枪动作 中,我将身体变成红色。
预期的结果是: 开枪时,如实播放开枪动作,身体呈现红色,则成功。如果是蓝色,失败。
实验结果记录:
层顺序 | arms层的 混合模式 |
arms层的 权重 |
结果 |
上:Base Layer 下:arms |
override | 1 | 红色(成功) |
override | 0.5 | 紫色 | |
additive | 1 | 蓝色 | |
上:arms 下:Base Layer |
override | 1 | 蓝色 |
additive | 1 | 蓝色 |
结论分析
- 顺序很重要:下方的层,会覆盖上方的层。
- 现在回到一开始的问题:如何理解“优先级是按顺序从上到下”?我的理解是:先计算上方的层,后计算下方的层,后面的结果可以修改之前的结果。跟Sprite的Sort Order一样去理解就可以了。
- override 模式: 覆盖位于它上方的层。
- 例如,多个层都控制某一属性,override层会覆盖其上方的层的效果,覆盖的程度取决于权重:
- 权重=1时,可以完全覆盖(所以结果呈红色);权重=0时,等于完全没有效果,以此类推。所以在上面的实验中,权重=0.5时,按比例混合其效果(0.5红+0.5蓝 = 紫)。
- additive 模式:
- 将动画“加”在之前的层上 (见下文)
- 所以一般的做法就是,将 “特别的” 动画放在下面的层,选择override,权重=1,就可以完美播放该层的动画。
以上个人解读,如有谬误欢迎指正
Edit : 感谢评论区朋友的指正,重新看了下文档,确实由于我实验方法的特殊性,造成了误导性的结论(关于Additive的混合方式的解读),已更正。
关于Additive
文档说明:
- Select Override to use the animation on this layer, replacing the animation on previous layers.
- Select Additive to add the animation on this layer on top of the animation from previous layers.
For additive blending to be successful, the animation on the additive layer must contain the same properties as the previous layers.
我翻译:文章来源:https://www.toymoban.com/news/detail-442606.html
- 使用 Override 模式:用这一层的动画替换掉之前层的动画。
- 使用 Additive 模式:把这一层的动画“加”在之前层的动画上。为了成功混合,Additive层的动画必须包含与之前层相同的属性。
重新实验了一下,对于Additive层的“加”我是这样理解的:文章来源地址https://www.toymoban.com/news/detail-442606.html
- 有些属性可以“加”,比如transform(位置,旋转等)
- 例如,我在BaseLayer对物体的position做了【向左每秒移动1单位】的动画,如果在Additive层对其做【向左每秒移动2单位】动画,得到的结果是:该对象【向左每秒移动3单位】。
- 而颜色属性似乎不能”加“,本以为可以简单地得到”红+蓝=紫“这样的结果,然而在Additive层,它并不能得到这个结果,反而override层将权重调到0.5时, 得到了紫色的混合结果。
- (个人猜测:为什么颜色属性不能Additive,可能涉及到叠加的算法?颜色叠加的模式太多了,没有一个通用的定义,红+蓝=紫只是一个通俗的结论,但具体到把颜色作为RGBA的float4变量时,加法并不等于“叠加”。叠加是乘法,得到的结果通常视觉上是变暗,而加法得到的结果是变亮。颜色不像transform可以简单做加法。)
- 还有就是帧动画,放在Additive层的sprite属性会直接替换掉前面层的。(权重大于0.5时)
到了这里,关于【unity实践记录】动画层的顺序和混合模式Override/Additive的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!