我在我的 3D 世界中有两个 SCNNodes A 和 B。 A 由用户移动,而 B 具有使其从左向右移动的 Action 。这是对 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 一起移动。我在考虑将 Action 的副本应用到新位置,或者如果可能的话,将当前正在执行的 Action 应用到节点 A。我还想使 A 成为 B 的子节点,然后将其移回根节点,但这似乎不起作用。
最佳答案
解决方案是简单地访问与此代码发生冲突的节点上当前正在运行的 SCNAnimations:
let action: SCNAction = contact.nodeB.actionForKey("MovementAction")!
contact.nodeA.runAction(action)
一旦您获得了对当前操作的引用,您就可以在另一个节点上运行它,它将被精确地镜像。
注意:记得在创建 Action 的时候指定 Action 的key,否则这个方法不会生效。
关于ios - 将当前正在运行的 SCNAction 应用于另一个 SCNNode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35232632/