跳到主要内容

通用动画控制

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}),
);

注意事项

  • 确认模型已绑定动画片段。可在编辑器模型属性中预览,名称需与脚本中一致。
  • isLooptrue 时,Promise 不会自动 resolve,可结合 setTimeout 或外部事件结束循环。
  • 为保持性能,避免在同一帧触发大量动画,可加入微小延迟:await editor.sleep(16)

借助 acs 能快速让场景具备动态反馈,与 AGV 脚本协同实现整套作业演示。