如何在RealityKit中实现类似SceneKit里SCNAction.run()的回调动作?
如何在RealityKit中实现类似SceneKit里SCNAction.run()的回调动作?
老哥我太懂你这种迁移的头疼了!把SceneKit游戏转去RealityKit的时候,最怀念的就是SCNAction.run()这种能在动作序列里插回调的功能——毕竟这种“做完动画就执行逻辑”的模式在各种游戏引擎里都是标配。RealityKit官方给的基础动作确实看起来比较局限,但其实咱们可以通过自定义EntityAction来实现完全一样的效果,虽然官方文档写得有点简略,但实操起来并不复杂。
核心思路:自定义零时长回调动作
RealityKit允许我们创建自定义的EntityAction,如果把动作的时长设为0,它就会在序列中立即执行,完全复刻SCNAction.run()的行为。我们可以封装一个工具函数,把回调逻辑打包成可复用的动作:
import RealityKit // 封装一个带无参回调的自定义动作 func runCallback(_ callback: @escaping () -> Void) -> EntityAction { return EntityAction.custom(duration: 0.0) { _, _ in callback() } } // 如果需要在回调里访问当前实体,可以用这个重载版本 func runCallback(_ callback: @escaping (Entity) -> Void) -> EntityAction { return EntityAction.custom(duration: 0.0) { entity, _ in callback(entity) } }
用回调动作构建序列
有了上面的工具函数,咱们就能像在SceneKit里一样,把回调动作和基础动画动作串成序列了:
// 先定义基础动画动作 let scaleUpAction = FromToByAction.scale(to: [2.0, 2.0, 2.0], duration: 1.0) let fadeOutAction = FromToByAction.fadeOut(duration: 0.5) // 构建包含回调的动作序列 let actionSequence = EntityAction.sequence([ scaleUpAction, runCallback { // 缩放完成后执行的逻辑 print("缩放动画结束啦!") }, fadeOutAction, runCallback { entity in // 淡出完成后,还能拿到当前实体做操作 print("\(entity.name ?? "未命名实体") 已经消失,准备移除它") entity.removeFromParent() } ]) // 给目标实体运行这个序列动作 yourTargetEntity.runAction(actionSequence)
额外提示
- 这种零时长的自定义动作不会占用序列的时间,会在前一个动作完成后立刻执行回调,和SCNAction.run()的行为完全一致。
- 如果需要让回调延迟执行,只需要把自定义动作的duration设为你想要的延迟时间就行,比如
duration: 1.0就会等1秒后再执行回调。 - 整个序列的播放速度也可以通过
EntityAction.playbackSpeed(_:)来调整,和SceneKit的逻辑保持一致。
内容来源于stack exchange
相关产品推荐
相关产品推荐

