我希望能夠在SceneKit中一個接一個地運行多個動畫。我實現它運行一個動畫像這樣的功能: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的完成塊在不可預知的時間內觸發?