RealityKit动画无确定性完成回调问题 寻求解决方案
RealityKit动画确定性完成回调方案
针对你遇到的动画无法按时完成、依赖延迟执行后续逻辑不可靠的问题,RealityKit提供了两种原生的确定性完成回调方案,完全替代DispatchQueue.main.asyncAfter的临时写法:
方案一:利用AnimationController的completed回调
entity.move(to:)方法会返回一个AnimationController实例,通过它的completed闭包可以监听动画的实际完成事件,这是最直接的方案:
let newTransform = Transform( scale: currentTransform.scale, rotation: newRotation, translation: currentTransform.translation) // 保存动画控制器实例 let animationController = entity.move( to: newTransform, relativeTo: anchor, duration: duration, timingFunction: .easeInOut ) // 设置完成回调 animationController.completed = { [weak self] in // 此处执行动画完成后的后续逻辑,比如启动下一个动画 self?.startNextAnimation() }
方案二:使用runAction(_:completion:)方法
通过Action封装动画,再调用entity.runAction(_:completion:),同样可以拿到精准的完成回调:
let newTransform = Transform( scale: currentTransform.scale, rotation: newRotation, translation: currentTransform.translation) // 创建移动动作 let moveAction = Action.move( to: newTransform, relativeTo: anchor, duration: duration, timingFunction: .easeInOut ) // 执行动作并设置完成回调 entity.runAction(moveAction) { [weak self] in // 动画完成后的逻辑 self?.startNextAnimation() }
注意事项
- 两种方案的回调都会在动画真正完成时触发,不受系统负载、动画中断(比如实体被移除、动画被取消)等情况影响,完全替代不可靠的延迟执行方式。
- 建议使用
[weak self]避免循环引用,防止内存泄漏。
内容的提问来源于stack exchange,提问作者Hope
相关产品推荐
相关产品推荐

