Ich möchte in SceneKit mehrere Animationen nacheinander ausführen können. Ich habe eine Funktion implementiert, die so eine Animation wie läuft:Mehrere serielle Animationen in 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()
}
Und dann habe ich versucht, mehrere serielle Animationen wie so laufen:
func animateMoves(_ moves: [Move]) {
for (index, move) in moves.enumerated() {
perform(#selector(animateMove(_:)),
with: move,
afterDelay: TimeInterval(Double(index) * move.duration)
}
}
Alles belebt aber die Animationen nicht seriell ablaufen. Animationen beginnen und enden in unvorhersehbarer Zeit. Probenprotokolle von Debugger:
Animate move started 1
Animate move started 2
Animate move finished 1
Animate move finished 2
Animate move started 3
Animate move finished 3
Ich weiß, dass mein Ansatz ist nicht die beste, aber nur so konnte ich fast Arbeits Animationen erzielen.
Ich weiß, dass es eine SCNAction-Klasse gibt. Vielleicht sollte ich viele Aktionen innerhalb einer Transaktion machen? Wenn ja, könnte mir jemand erklären, wie genau SCNTransactions funktionieren und warum der Completion-Block der Completion SCNTransaction in unvorhersehbarer Zeit ausgelöst wird?