动画控制组件
(API)的作用是读取 动画控制器
(详细介绍)的数据,并播放其内容。
属性 | 功能说明 |
---|---|
animatorController | 绑定 AnimatorController 资产 |
当把模型拖入到场景中,模型以初始姿态展示,并不会播放任何动画,这时需要在模型实体上找到 动画控制组件
并为它绑定一个 动画控制器
资产。
动画控制组件
模型的 动画控制组件
在glTF实例的根实体上,也就是编辑器的模型实体下的第一个子 实体
上。
如果模型内有动画,会为你自动绑定一个只读的 动画控制器
。
如果没有 动画控制组件
可以按下图方式创建
创建一个 动画控制器
资产并绑定到模型上,创建 动画控制器
有两种方式:
Create
-> Animation Controller
+
,选择 Animation Controller
在动画控制组件
的动画控制器属性上替换为刚才创建的 动画控制器
动画控制器
后(可以参考动画控制器文档)你就可以播放其中的动画了在使用脚本之前,建议先阅读以下文档:
你可以使用 animator.play 方法来播放指定的 动画状态
,参数说明详见API 文档。
import { Script, Animator, Keys } from '@galacean/engine';
export default class extends Script {
onStart() {
const animator = this.entity.getComponent(Animator);
animator.play("State Name");
}
}
如果需要在动画中的某一时刻开始播放可以通过以下方式
import { Script, Animator, Keys } from '@galacean/engine';
export default class extends Script {
onStart() {
const animator = this.entity.getComponent(Animator);
const layerIndex = 0;
const normalizedTimeOffset = 0.5; // 归一化的时间
animator.play("State Name", layerIndex, normalizedTimeOffset);
}
}
你可以通过 speed 属性来控制动画的播放速度。 speed
默认值为 1.0
,值越大播放的越快,越小播放的越慢。当值为负数时,进行倒播。
animator.speed = 2.0;
你可以通过设置 animator.enabled 来停止和重新播放动画
// 停止
animator.enabled = false;
// 重新播放
animator.enabled = true;
你可以通过设置 animator.speed 暂停和恢复播放
// 暂停
animator.speed = 0;
// 恢复
animator.speed = 1;
如果你只想针对某一个 动画状态
进行暂停,可以通过将它的速度设置为 0 来实现。
const state = animator.findAnimatorState("xxx");
state.speed = 0;
你可以使用 animator.crossfade 方法来将动画过渡到指定的 动画状态
,参数说明详见API 文档。
animator.crossFade("OtherStateName", 0.3);
你可以使用 getCurrentAnimatorState 方法来获取当前正在播放的 动画状态
。参数为 动画状态
所在 动画层
的序号layerIndex
, 详见API 文档。获取之后可以设置 动画状态
的属性,比如将默认的循环播放改为一次。
const currentState = animator.getCurrentAnimatorState(0);
// 播放一次
currentState.wrapMode = WrapMode.Once;
// 循环播放
currentState.wrapMode = WrapMode.Loop;
你可以使用 findAnimatorState 方法来获取指定名称的 动画状态
。获取之后可以设置动画状态的属性,比如将默认的循环播放改为一次。
const state = animator.findAnimatorState("xxx");
// 播放一次
state.wrapMode = WrapMode.Once;
// 循环播放
state.wrapMode = WrapMode.Loop;
你可以通过设置 动画控制组件
的 cullingMode 来设置当 实体
不可见时动画是否进行计算。在动画被裁剪时,动画不会进行计算并应用到 实体
上,但动画的状态仍然会随着时间更新,使其再可见时是正确地表现。