ios - 将当前正在运行的 SCNAction 应用于另一个 SCNNode

标签 ios scenekit

我在我的 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/

相关文章:

ios - 使用 isKindOfClass 进行多个类检查来简洁地评估对象

IOS - 如何从 WKWebView 获取缓存资源?

ios - 如何设置SCNShape的细节层次/平滑度/分割率?

c# - MonoTouch MKLocalSearch示例

ios - TabBarController - 第一个 View 偏移 20px

ios - SceneKit 相机在不应该显示的时候显示额外的空间

ios - 场景套件中的颜色线?

IOS 11 更新更改了我的节点的颜色

ios - 无法在选择器 View 中滚动的情况下选择默认值

ios - 如何使用平移手势识别器在 ARSCNView 中移动节点?