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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 13:04:35