如何在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
相关产品推荐
相关产品推荐

