【发布时间】:2017-08-08 01:15:00
【问题描述】:
我希望能够在 SceneKit 中一个接一个地运行多个动画。我已经实现了一个像这样运行一个动画的函数:
fileprivate func animateMove(_ move: Move) {
print("Animate move started " + move.identifier)
// I am creating rotateNode
let rotateNode = SCNNode()
rotateNode.eulerAngles.x = CGFloat.pi
scene.rootNode.addChildNode(rotateNode)
// Then I am selecting nodes which I want to rotate
nodesToRotate = ...
// Then I am adding the nodes to rotate node
_ = nodesToRotate.map { rotateNode.addChildNode($0) }
SCNTransaction.begin()
SCNTransaction.animationDuration = move.animationDuration
SCNTransaction.completionBlock = {
rotateNode.enumerateChildNodes { node, _ in
node.transform = node.worldTransform
node.removeFromParentNode()
scene.rootNode.addChildNode(node)
}
rotateNode.removeFromParentNode()
print("Animate move finished " + move.identifier)
}
SCNTransaction.commit()
}
然后我尝试像这样运行多个串行动画:
func animateMoves(_ moves: [Move]) {
for (index, move) in moves.enumerated() {
perform(#selector(animateMove(_:)),
with: move,
afterDelay: TimeInterval(Double(index) * move.duration)
}
}
一切都在制作动画,但动画不会以串行方式运行。动画在不可预测的时间开始和结束。 来自调试器的示例日志:
Animate move started 1
Animate move started 2
Animate move finished 1
Animate move finished 2
Animate move started 3
Animate move finished 3
我意识到我的方法不是最好的,但只有这样我才能实现几乎可以工作的动画。
我知道有一个 SCNAction 类可用。也许我应该在一笔交易中采取许多行动?如果是这样,有人可以向我解释一下 SCNTransactions 是如何工作的,以及为什么完成 SCNTransaction 的完成块会在不可预测的时间内触发?
【问题讨论】:
标签: ios swift animation scenekit scntranscaction