Files
engine/docs/zh/animation/layer.mdx
鹅叔 dc1a4793ed Docs: remove playgrounds (#2689)
* fix: doc typo
2025-05-23 17:24:53 +08:00

63 lines
3.5 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
order: 5
title: 动画层
type: 动画
label: Animation
---
`动画层`[API](/apis/core/#AnimatorControllerLayer))用于在一个 `动画控制器`[详细介绍](/docs/animation/animatorController) 中组织和管理 `动画状态机`[详见](/docs/animation/state-machine/))。
每个 `动画层` 都有其自己的 `动画状态机`。在 `动画控制组件` 运行时所有的 `动画层` 同时运行,通过 `混合权重` 及 `混合模式` 控制各个 `动画层` 对整体动画的影响。
| 属性 | 功能说明 |
| :------- | :--------------------------------------------------------------------------------- |
| Name | 该层的名字。 |
| Weight | 该层的混合权重,默认值为 1.0 。 |
| Blending | 该层的混合模式,`Additive` 为叠加模式, `Override` 为覆盖模式,默认值为 `Override` |
| StateMachine | 该层的动画状态机,[详细介绍](/docs/animation/state-machine/) |
### 叠加模式
叠加模式下,较高层的动画会在较低层动画的基础上叠加。这个模式下先计算动画关键帧的差异,将这些差异应用到较低层动画上,从而实现动画的叠加效果(随着权重的增加,不会减少下层对动画的影响) 它常用于在基础动作上添加细节或调整。例如,角色在行走时可以使用 `Additive` 模式叠加一个呼吸动画,或在攻击时增加一个表情变化。
#### 使用示例
我们在编辑器添加一个 `动画层`,并将 `Blending` 选为 `Additive` 即可
<Image src="https://mdn.alipayobjects.com/huamei_3zduhr/afts/img/A*JyqiQ6kvqBcAAAAAAAAAAAAADsJ_AQ/original" />
### 覆盖模式
覆盖模式下,较高层的动画会完全覆盖较低层的动画。这意味着在最终的动画输出中,较高层的动画会优先显示并替代较低层的动画效果(随着权重的增加,减少下层对动画的影响)。它常用于动画的分层控制。例如,你可能需要对不同身体部位的动作进行单独控制。`Override` 模式可以分离地控制各个部分,比如在跑步的同时调整上半身的姿势或动作。
<Callout type="info">
第一层的混合模式始终是覆盖模式。
</Callout>
#### 使用示例
将 `Blending` 选为 `Override` 即可
<Image src="https://mdn.alipayobjects.com/huamei_3zduhr/afts/img/A*5TfbQJjPZDMAAAAAAAAAAAAADsJ_AQ/original" />
可以看到角色的动画完全替换掉了第一层的动画
### 混合权重
它用于控制特定 `动画层` 对最终动画结果的影响程度,是一个介于 0 到 1 之间的浮点值决定了该层动画在最终动画中的混合比例。例如叠加模式的层会使角色的头转90度如果该层的混合权重是0.5则角色只会旋转45度。
<Callout type="info">
第一层的权重始终是1.0。
</Callout>
#### 使用示例
<Image src="https://mdn.alipayobjects.com/huamei_3zduhr/afts/img/A*HSxgTZIDqQ0AAAAAAAAAAAAADsJ_AQ/original" />
可以看到 `动画层` 的权重越高对动画效果的影响越大。
## 脚本使用
```typescript
const layers = animator.animatorController.layers;
const baseLayer = layers[0];
const additiveLayer = layers[1];
// 叠加模式
additiveLayer.blendingMode = AnimatorLayerBlendingMode.Additive;
// 覆盖模式
additiveLayer.blendingMode = AnimatorLayerBlendingMode.Override;
additiveLayer.weight = 0.5;
```