我想在IOS上为ARKit创建射击游戏。在这个游戏中,我将弹丸射击到场景中,当它们碰撞时,我想对被击中的物体造成一些损害。
func physicsWorld(_ world: SCNPhysicsWorld, didBegin contact: SCNPhysicsContact) {
if contact.nodeA.physicsBody?.categoryBitMask == PhysicType.Target.rawValue {
//Hit target
}else if contact.nodeB.physicsBody?.categoryBitMask == PhysicType.Target.rawValue {
//Hit target
}
}
我要搜索的内容应如下所示:
let target = contact.nodeA as? Target
target.hit()
但是似乎无法将节点转换为我的Target类。另一个想法是,将目标节点的位置与场景中所有节点的位置进行比较。如果它们的位置相同,我知道可以在哪个节点上调用该方法:
func hitTarget(node: SCNNode){
for child in scene.childNodes{
if child.name == "Target" {
guard let target = child as? Target else {continue}
if target.presentation.position.x == node.presentation.position.x &&
target.presentation.position.y == node.presentation.position.y &&
target.presentation.position.z == node.presentation.position.z{
target.hit(damage: 5)
}
}
}
}
我当前在场景中只有一个对象,因此它必须是目标对象。但是无论如何,这两种立场都不同。我真的不知道node.position和node.presentation.position之间的区别。但是我都尝试过。
重要的是,因为我认为这可能是问题所在:我有一个中心对象。我添加的所有目标对象都相对于该中心对象。所以我有rootNode-> centerObj-> [所有目标对象] 也许这就是为什么位置不一样的原因。
我想知道的是,如何正确地获取正确的节点(该节点已被我击中并将其转换为它所属的类)?