Я хочу создать игру-стрелялку для ARKit на IOS.В этой игре я стреляю снарядами в сцену, и когда они сталкиваются, я хочу нанести некоторый урон объекту, который был поражен.
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 -> [все целевые объекты] Может быть, именно поэтому позиции не совпадают.
То, что я хочу знать, это то, как правильно получить правильный узел,который я ударил и может привести его к классу, к которому он принадлежит?