You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在RealityKit中像SceneKit那样并发执行多个动画动作?

如何在RealityKit中像SceneKit那样并发执行多个动画动作?

这个问题我之前迁移SceneKit项目到RealityKit时也碰到过!你猜的完全没错——问题核心就是两个动画都绑定到了同一个.transform目标上。RealityKit里,如果两个动画操作的是实体的同一个完整属性集合(比如整个Transform),后启动的动画会直接覆盖先启动的,所以你只能看到缩放动画在运行。

给你两种简单可行的解决方法,任选其一都能实现多个动画并发执行:

方案一:分别绑定到Transform的子属性

既然冲突源于操作整个Transform,那我们可以让每个动画只针对Transform的单个子属性(平移对应translation,缩放对应scale),这样它们就不会互相干扰了。修改后的代码如下:

// 平移动画:仅操作translation子属性
let translateAction = FromToByAction<SIMD3<Float>>(
    from: [0.0, 2.0, 0.0],
    to: [0.0, -2.0, 0.0],
    mode: .parent,
    timing: .linear,
    isAdditive: true
)
let translateAnimation = try! AnimationResource.makeActionAnimation(
    for: translateAction,
    duration: 5.0,
    bindTarget: \.transform.translation  // 绑定到平移属性
)

// 缩放动画:仅操作scale子属性
let scaleAction = FromToByAction<SIMD3<Float>>(
    from: SIMD3(0.5, 0.5, 0.5),
    to: SIMD3(2.5, 2.5, 2.5),
    mode: .local,
    timing: .linear,
    isAdditive: true
)
let scaleAnimation = try! AnimationResource.makeActionAnimation(
    for: scaleAction,
    duration: 10,
    bindTarget: \.transform.scale  // 绑定到缩放属性
)

// 现在可以同时播放两个动画,互不影响
box.playAnimation(translateAnimation)
box.playAnimation(scaleAnimation)

方案二:使用动画组(AnimationGroup)

如果你更习惯SceneKit里打包动作的方式,RealityKit也支持把多个AnimationResource合并成一个动画组,一次性播放整个组:

// 按原方式创建两个完整的Transform动画
let translateAction = FromToByAction<Transform>(
    from: Transform(translation: [0.0, 2.0, 0.0]),
    to: Transform(translation: [0.0, -2.0, 0.0]),
    mode: .parent,
    timing: .linear,
    isAdditive: true
)
let translateAnimation = try! AnimationResource.makeActionAnimation(
    for: translateAction,
    duration: 5.0,
    bindTarget: .transform
)

let scaleAction = FromToByAction(
    from: Transform(scale: SIMD3(0.5, 0.5, 0.5)),
    to: Transform(scale: SIMD3(2.5, 2.5, 2.5)),
    mode: .local,
    timing: .linear,
    isAdditive: true
)
let scaleAnimation = try! AnimationResource.makeActionAnimation(
    for: scaleAction,
    duration: 10,
    bindTarget: .transform
)

// 将两个动画合并为一个组
let combinedAnimation = AnimationResource.group([translateAnimation, scaleAnimation])

// 播放组动画,两个动作会同步执行
box.playAnimation(combinedAnimation)

这两种方法都能解决你的问题:方案一更灵活,后续单独控制某个动画的启停更方便;方案二更贴近SceneKit的使用习惯,适合批量管理动画。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 13:07:58