通用动画控制
AnimationCommonScriptManager(脚本变量 acs)负责触发角色、机械臂、门禁等带动画资源的对象。除基础播放外,也支持循环、反向、速度调节等选项。
playAnimation 方法
playAnimation({
objectName: string;
funcName: string;
clampWhenFinished?: boolean;
isLoop?: boolean;
speed?: number;
reverse?: boolean;
}): Promise<void>;
objectName:动画所在模型的名称。funcName:动画片段关键字,不区分大小写,当模型中存在多个片段时会模糊匹配。clampWhenFinished:是否在结束时保持最终姿态。isLoop:是否循环播放,默认为false。speed:播放速度倍数,1为原速。reverse:为true时反向播放动画(需模型支持)。
示例:
await acs.playAnimation({
objectName: 'robotArm01',
funcName: 'grab',
clampWhenFinished: true,
speed: 1.5,
});
常见组合技巧
循环与条件离开
let stop = false;
async function loopOpenClose() {
while (!stop) {
await acs.playAnimation({objectName: 'gate_1', funcName: 'open', isLoop: false});
await acs.playAnimation({objectName: 'gate_1', funcName: 'close', isLoop: false});
}
}
loopOpenClose();
// 需要结束时设置 stop = true;
复合动作
可与 GSAP、requestAnimationFrame 配合实现多段动画,例如先播放机械臂动作,再移动平台。
await acs.playAnimation({objectName: 'armA', funcName: 'pick'});
await agvManager.moveCarrier('AGV_A', ['POINT_PICK', 'POINT_DROP']);
await acs.playAnimation({objectName: 'armA', funcName: 'place'});
状态检测
脚本本身不会返回动画状态,可自行维护标记:
let armBusy = false;
async function safePlay(func) {
if (armBusy) return;
armBusy = true;
try {
await func();
} finally {
armBusy = false;
}
}
safePlay(() =>
acs.playAnimation({objectName: 'armA', funcName: 'grab', clampWhenFinished: true}),
);
注意事项
- 确认模型已绑定动画片段。可在编辑器模型属性中预览,名称需与脚本中一致。
- 当
isLoop为true时,Promise不会自动 resolve,可结合setTimeout或外部事件结束循环。 - 为保持性能,避免在同一帧触发大量动画,可加入微小延迟:
await editor.sleep(16)。
借助 acs 能快速让场景具备动态反馈,与 AGV 脚本协同实现整套作业演示。