我的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可能发生碰撞,如果触摸B,则A必须开始与B一起移动,就像它们是一个单个对象一样,直到用户使用命令移动A.在方法中检测到碰撞
func physicsWorld(world: SCNPhysicsWorld, didBeginContact contact: SCNPhysicsContact)
但是我不知道我应该采取什么方法来使用B进行移动。我正在考虑将操作的副本应用于新位置,或者如果可能,将当前正在执行的操作应用于节点A.我还想过使A成为B的孩子然后将其移回根节点,但它似乎不起作用。
答案 0 :(得分:1)
解决方案只是访问与此代码冲突涉及的节点上当前运行的SCNAnimations:
let action: SCNAction = contact.nodeB.actionForKey("MovementAction")!
contact.nodeA.runAction(action)
一旦你有了对当前操作的引用,你就可以在另一个节点上运行它,它将被完全镜像。
注意:请记住在创建操作时指定操作的键,否则此方法无法正常工作。