动画片段
(API)是 Galacean 动画系统的核心元素之一,Galacean 支持导入外部设计软件设计的模型动画,设计师输出的带动画的模型中的每个动画在 Galacean 中会被解析成一个个的 动画片段
资产,我们也可以通过动画片段编辑器创作额外的动画。
有两种常用的方式得到 动画片段
动画片段
(下文会介绍编辑器和脚本这两种创建方式)动画片段编辑器目前支持除物理相关组件的所有可插值属性的编辑,如果你需要编辑其他属性,要在实体上添加对应的组件。
序号 | 说明 | 备注 |
---|---|---|
1 | 切换动画片段 | |
2 | 开启/关闭录制模式 | |
3 | 播放/暂停动画片段 | |
4 | 重新播放动画片段 | |
5 | 添加动画事件 | |
6 | 当前帧 | 时间线所在帧数 |
7 | 切换到关键帧模式 | |
8 | 切换到曲线模式 | 曲线模式用于调整关键帧间如何变化 |
9 | 已添加动画属性 | |
10 | 添加关键帧 | |
11 | 添加动画属性 | |
12 | 关键帧 | 关键帧用于描述在指定帧数时动画属性的值应是多少 |
13 | 时间线 | 添加关键帧或动画事件时,它们的时间为时间线所在帧数 |
14 | 帧数 | : 左侧为秒数,右侧为不到 1 秒的帧数。动画编辑器以 60FPS 为基准, 上图所示时间0:30 为 30 帧处, 若时间轴刻度为1:30 则为 90 帧处 |
+
创建 动画片段
资产动画片段
资产,并选择一个实体作为 动画片段
的编辑对象点击 创建
按钮编辑器会自动为你的 实体
添加 动画控制组件
(详细介绍)并将该 动画片段
添加到 动画控制器
中
当我们点击添加关键帧按钮时,关键帧会存入当前指定属性的值,所以当我们什么都未改变时,关键帧存入的是此刻这个实体的 position
值。我们希望他 60 帧后移动到 (3, 0, 0)的位置,所以先将这个正方体通过属性面板修改到(3, 0, 0) 再添加关键帧
同理我们也为 rotation
属性添加关键帧
我们提供了录制模式以方便开发者快速的添加关键帧。开启录制模式,当对应的属性修改时就会自动添加关键帧
选中关键帧并拖动即可
可以滑动 鼠标滚轮
缩放时间轴
开启录制模式,把时间线移动到指定关键帧上,然后重新输入值即可, 在不开启录制模式的情况,需要重新点击添加关键帧按钮。
选中关键帧右键选择删除,也可以按键盘上的删除键/退格键删除
动画片段
不仅可以作用于添加动画控制组件
(详细介绍)的 实体
上,还可以作用于它的子实体
上。
实体
实体
的属性可以添加了实体
添加关键帧即可动画片段编辑器
支持动画曲线编辑,点击右上角的曲线Icon即可切换
曲线模式的纵轴为属性的数值
你可以按 shift+鼠标滚轮
调整纵轴的比例
属性对应曲线的颜色与按钮的颜色相同
选择关键帧会出现两个控制点,调整控制点即可调整曲线
也可以通过右键关键帧直接设置内置的预设值
选择属性面板的属性可以仅编辑指定属性的曲线
Transform
组件,Galacean 还支持编辑其他组件的动画,可以阅读文字动画文档来了解。动画曲线
, 可以阅读帧动画文档来了解。在使用脚本之前,建议先阅读以下文档:
你可以自己创建一个 动画片段
(API)并通过 addCurveBinding 为它添加 动画曲线
(API)。
//custom rotate clip
const rotateClip = new AnimationClip("rotate");
const rotateState =
animator.animatorController.layers[0].stateMachine.addState("rotate");
rotateState.clip = rotateClip;
const rotateCurve = new AnimationVector3Curve();
const key1 = new Keyframe<Vector3>();
key1.time = 0;
key1.value = new Vector3(0, 0, 0);
const key2 = new Keyframe<Vector3>();
key2.time = 10;
key2.value = new Vector3(0, 360, 0);
rotateCurve.addKey(key1);
rotateCurve.addKey(key2);
rotateClip.addCurveBinding("", Transform, "rotation", rotateCurve);
//custom color clip
const colorClip = new AnimationClip("color");
const colorState =
animator.animatorController.layers[0].stateMachine.addState("color");
colorState.clip = colorClip;
const colorCurve = new AnimationFloatCurve();
const key1 = new Keyframe<number>();
key1.time = 0;
key1.value = 0;
const key2 = new Keyframe<number>();
key2.time = 10;
key2.value = 1;
colorCurve.addKey(key1);
colorCurve.addKey(key2);
colorClip.addCurveBinding("/light", DirectLight, "color.r", colorCurve);
你同样可以为你的子实体 /light
添加 AnimationCurve
,就像上面的代码示例,同时 addCurveBinding
的第三个参数并不局限于组件的属性,它是一个能索引到值的路径。
你可以使用 AnimationEvent 来为 AnimationClip 添加事件,动画事件将在指定时间调用你在同一实体上绑定组件的指定回调函数。
const event = new AnimationEvent();
event.functionName = "test";
event.time = 0.5;
clip.addEvent(event);