Некоторые отличные комментарии здесь и не уверен, почему тоже.Они основывают все это на узлах и именах узлов - кажется, что это может быть лучше, поскольку поиск вещей после того, как факт медленнее.Вот как я справился с этим, подобно тому, что говорят другие.
Поскольку у меня есть куча ракет, я просто называю узел = "Missi" + String (формат: "% 04d", vIndex),name = "Explo" + String (формат: "% 04d", vIndex) и т. д., таким образом, я могу добавить префикс к тому, что я ищу, и перейти непосредственно к моему массиву узлов и делать свое дело.У меня есть сотни дел, но функция столкновений довольно мала.
func physicsWorld(_ world: SCNPhysicsWorld, didBegin contact: SCNPhysicsContact)
{
guard let nodeNameA = contact.nodeA.name else { return }
guard let nodeNameB = contact.nodeB.name else { return }
//print("CONTACT: \(nodeNameA) \(nodeNameB)")
if(nodeNameA.prefix(5) == "Explo" && nodeNameB.prefix(5) == "Enemy")
{
gameControl.defenseMissileHit(vIndex: Int(nodeNameB.suffix(4))!)
}
if(nodeNameA.prefix(5) == "Enemy" && nodeNameB.prefix(5) == "Explo")
{
gameControl.defenseMissileHit(vIndex: Int(nodeNameA.suffix(4))!)
}
if(nodeNameA.prefix(5) == "Explo" && nodeNameB.prefix(5) == "Missi")
{
//print("HIT")
gameControl.enemyMissileHit(vIndex: Int(nodeNameB.suffix(4))!)
}
if(nodeNameA.prefix(5) == "Missi" && nodeNameB.prefix(5) == "Explo")
{
//print("HIT")
gameControl.enemyMissileHit(vIndex: Int(nodeNameA.suffix(4))!)
}
}
Я не делаю узлы подклассов, я создаю классы, такие как DefenseObject, с нужным мне материалом, затем создаю массив, который я могуПрямой доступ или цикл.
var defenseObjects: [Int:DefenseObject] = [:]
class DefenseObject: ObjectBase
{
var index: Int = 0 // Index of object
var name: String = "" // Object name
var isActive: Bool = false // Object is active
init(vGameType: gameTypes, vCount: Int, position: SCNVector3)
{
super.init(vGameType: vGameType, vIndex: vCount)
isActive = true
name = "Enemy" + String(format: "%04d", vIndex)
}
}
Тогда я могу перейти прямо к индексу и выполнить defenseObjects [NDex] .call ().Я также не пытаюсь очистить узлы во время волны, я устанавливаю переключатель isActive и скрываю их.В конце волны я убираю их.
Надеюсь, это поможет.