动画
PlayCanvas 通过播放动画片段驱动实体层级。片段是一组按时间排列、作用于具名节点属性的关键帧,例如角色骨骼、机械部件或灯光颜色等组件属性。anim 组件在所属实体下的层级播放片段,本节其他功能均建立于此。
GLB 动画
加载上方霸王龙后,可以拖动环绕观察。它来自 Web Components 示例,动画只需在 <pc-model> 内添加一个空 <pc-anim>。未声明片段时,会循环播放模型自己的动画。各开发方式对比了相同功能的用法。
动画如何工作
- **片段**通常随模型导入。GLB 或编辑器导入的 FBX 可包含动画,也能通过代码从关键帧创建。片段按节点名称绑定,因此可以用于节点名称一致的不同模型。
- anim 组件在实体下方层级播放片段。各片段放在一个状态中,切换时可交叉淡化。
- 状态图决定播放状态,包括状态、过渡和过渡检查的参数,例如
speed或jump触发器。代码设置参数,状态图负责切换。 - **混合树**根据参数在同一状态中混合多个片段,例如从行走平滑变化到奔跑。
- **图层和遮罩**在同一模型上同时运行多个状态图,并限制作用节点,例如边走边挥手。
- **事件**在片段指定时间触发脚步音效、特效或玩法逻辑。
各开发方式
anim 组件本身一致,但各开发方式提供的界面和声明能力不同。未提供对应标记或 UI 的功能,可通过代码访问引擎组件。
| 引擎 | 编辑器 | React | Web Components | |
|---|---|---|---|---|
| 播放模型片段 | entity.anim.assignAnimation() | Anim 组件和状态图资源 | <Anim playing /> | <pc-anim> |
| 交叉淡化切换片段 | layer.transition() | 状态图过渡 | 引擎 API | clip 和 transition-time 特性 |
| 状态图与参数 | entity.anim.loadStateGraph() | Anim State Graph 资源编辑器 | 引擎 API | 引擎 API |
| 混合树 | 状态图数据 | 仅脚本 | 引擎 API | 引擎 API |
| 图层与遮罩 | entity.anim.addLayer() | 图层在状态图中,遮罩在 Anim 组件中 | 引擎 API | 引擎 API |
| 事件 | 片段上的 new pc.AnimEvents() | 动画资源中的事件 | 引擎 API | 引擎 API |
备注
anim 取代了不支持状态图的旧 animation 组件。旧组件仍可工作,但新项目应使用 anim。Spine 2D 骨骼动画见 Spine。
本节内容
- 播放动画:添加组件、播放与切换、速度、暂停、循环及完成检测。
- 动画片段:GLB/FBX 动画、节点绑定和代码创建片段。
- 状态图:状态、过渡、参数和条件,支持编辑器和代码创建。
- 混合树:按一维、二维参数或独立权重混合片段。
- 图层与遮罩:同时播放多个状态图、混合并限制模型部位。
- 动画事件:在指定时间触发和处理事件。
另请参阅
- Anim 组件:编辑器组件参考。
- 动画资源:编辑器预览和导入设置。
- 状态图混合:在编辑器构建混合状态图的教程。
- 动画示例:移动、混合树、图层遮罩、事件等引擎示例。
- AnimComponent 和 AnimComponentLayer:引擎 API。