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

如何获取执行中SCNAction的剩余时长?附动态关联Action需求

获取SCNAction剩余时长并同步NodeB的Action时长

好的,这个需求其实可以通过SceneKit提供的SCNAction属性轻松实现,我来一步步给你拆解:

1. 获取正在执行的SCNAction的剩余时长

首先,你需要确保在给NodeA添加Action时,为它设置一个唯一的key——这是后续能获取到这个运行中Action的关键。比如:

// 定义总时长10秒的Action
let totalDuration = 10.0
let nodeAAction = SCNAction.customAction(duration: totalDuration) { node, elapsedTime in
    // 这里写你的Action执行逻辑
}

// 给Action设置key,添加到NodeA
nodeA.runAction(nodeAAction, forKey: "continuousAction")

接下来,当你需要获取剩余时长时,通过这个key拿到正在运行的Action,再用总时长减去runningTime属性(该属性会返回Action已经运行的秒数):

// 尝试获取NodeA上运行的目标Action
if let runningAction = nodeA.action(forKey: "continuousAction") {
    let elapsedTime = runningAction.runningTime
    let remainingTime = totalDuration - elapsedTime
    // 在你的场景中,这里remainingTime就是6秒
}

2. 用剩余时长创建NodeB的Action,满足总时长要求

根据你的需求,要让NodeA的Action剩余时长与NodeB的Action时长之和等于10秒,那NodeB的Action时长应该是10.0 - remainingTime(在你的场景里就是10-6=4秒)。直接用计算出的时长创建新的Action并添加到NodeB即可:

// 基于剩余时长计算NodeB的Action时长
let nodeBDuration = 10.0 - remainingTime
let nodeBAction = SCNAction.customAction(duration: nodeBDuration) { node, elapsedTime in
    // NodeB的Action执行逻辑
}

// 启动NodeB的Action
nodeB.runAction(nodeBAction)

一些注意事项

  • 如果你没有给Action设置key,nodeA.action(forKey:)会返回nil,所以一定要记得添加key来标识你的Action
  • runningTime是只读属性,只能用来获取已运行时长,无法修改Action的运行状态
  • 如果你的Action是组合型的(比如SCNAction.sequence或SCNAction.group),runningTime返回的是整个组合Action的已运行总时长,这种情况下需要单独处理子Action的时长计算

内容的提问来源于stack exchange,提问作者R Bradshaw

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:31:17