如何获取执行中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
相关产品推荐
相关产品推荐

