将当前 运行 SCNAction 应用于另一个 SCNNode

Apply a current running SCNAction to another SCNNode

我的 3D 世界中有两个 SCNNode A 和 B。 A 由用户移动,而 B 具有使其从左向右移动的动作。这是对 B 的操作:

let moveDirection: Float = position.x > 0.0 ? -1.0 : 1.0
let moveDistance = levelData.gameLevelWidth()
let moveAction = SCNAction.moveBy(SCNVector3(x: moveDistance * moveDirection, y: 0.0, z: 0.0), duration: 10.0)
let action = SCNAction.runBlock { node -> Void in
}
carNode.runAction(SCNAction.sequence([moveAction, action]))

A​​ 和 B 可以发生碰撞,如果 A 接触 B,则 A 必须开始与 B 一起移动,就好像它们是一个单独的对象一样,直到用户使用命令移动 A。在方法中检测到碰撞

func physicsWorld(world: SCNPhysicsWorld, didBeginContact contact: SCNPhysicsContact)

但我不知道应该采取什么方法让 A 和 B 一起移动。我正在考虑将动作的副本应用到新的位置,或者如果可能的话,将当前正在执行的动作应用到节点 A。我也想过让A成为B的子节点,然后把它移回根节点,但是好像不行

解决方案只是访问与此代码发生冲突的节点上的当前 运行ning SCNAnimations:

let action: SCNAction = contact.nodeB.actionForKey("MovementAction")!
contact.nodeA.runAction(action)

一旦您获得了对当前操作的引用,您就可以 运行 它在另一个节点上,它将被准确地镜像。

注意:记得在创建动作时指定动作的key,否则此方法无效。