SCNTransaction是否自带重复功能?重复执行的标准方法是什么?
SceneKit动画相关问题与实现代码
实现代码
使用SCNAction实现持续重复旋转的函数
func scnActionFunc(nodeParam: inout SCNNode) { let angleAmount: CGFloat = 360 * (.pi / 180.0) let action = SCNAction.rotate(by: angleAmount, around: SCNVector3(x: 0, y: 1, z: 0), duration: 32.0) let repeatAction = SCNAction.repeatForever(action) nodeParam.runAction(repeatAction) }
使用SCNTransaction执行单次部分旋转的函数
func scnTransactionFunc(nodeParam: inout SCNNode) { SCNTransaction.begin() SCNTransaction.animationTimingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeOut) SCNTransaction.animationDuration = 3.0 nodeParam.transform = SCNMatrix4MakeRotation(-(.pi / 2.0), 1, 0, 0) SCNTransaction.commit() }
疑问
- 就目前了解,SCNTransaction似乎没有自带的重复函数,情况是否确实如此?
- 我知道可以通过Timer等类在函数中重复执行SCNTransaction代码,但是否存在一种标准方法来反复执行SCNTransaction代码?我并非寻求通用的重复实现方式,而是希望全面理解SCNTransaction,特此请教。
解答
是的,SCNTransaction确实没有自带的重复执行API。它的核心设计是用于批量提交单次的SceneKit属性变更动画,本质是对当前RunLoop周期内的属性修改做原子化的动画包装,没有内置的循环/重复机制。
从SCNTransaction的设计定位来说,不存在官方的“标准重复执行方法”。因为SCNTransaction的场景是一次性的状态变更动画,而重复动画本身属于SCNAction的职责范畴——SCNAction就是专门为节点的重复/序列动画设计的工具类。
如果非要用SCNTransaction实现重复效果,只能通过外部触发机制(比如Timer、CADisplayLink、或者Combine的定时器)来多次调用SCNTransaction代码,但这属于“通用重复实现”,并非SCNTransaction本身提供的能力,也不是官方推荐的用法。SceneKit的职责划分很明确:单次状态过渡用SCNTransaction,循环/序列动画用SCNAction,这是框架的设计意图。
内容的提问来源于stack exchange,提问作者JohnOfIreland
相关产品推荐
相关产品推荐

