Я бы сначала поместил всех своих врагов в специальный контейнер узлов на сцене, а затем, перед тем как наложить луч, сбросил свойство врагов isHidden
, используя forloop.
enemyContainer.children.forEach{$0.isHidden = false}
scene?.physicsWorld.enumerateBodies(alongRayStart: rayStart, end: rayEnd) { (body, point, normal, stop) in
if let sprite = body.node as? SKSpriteNode,sprite.categoryBitMask & ~0b1 \\Replace 0b1 with your category bit mask constant if you created one
sprite.isHidden = true
}
}
Это позволит вам сразу выяснить, касается ли свет врага, в отличие от ответа E.Coms, который будет сообщать вам только о том, когда враг попал в фазу обновления физики
если вы не хотите, чтобы ваши враги находились в специальном контейнере, тогда вы можете создать массив и хранить только те, которые были затронуты в последний раз, когда был наложен луч
//Global to class
var nodesInLight = [SKNode]()
.......
//in func
nodesInLight.forEach{$0.isHidden = false}
nodesInLight = [SKNode]() //Allow ARC to remove the previous container, instead of calling clear on it
scene?.physicsWorld.enumerateBodies(alongRayStart: rayStart, end: rayEnd) { (body, point, normal, stop) in
if let sprite = body.node as? SKSpriteNode,sprite.categoryBitMask & ~0b1 \\Replace 0b1 with your category bit mask constant if you created one
sprite.isHidden = true
nodesInLight.append(sprite)
}
}
Продвинутая техника, которую я бы сделал, - это создать массив слабых ссылок, таким образом, вы случайно не создадите цикл сохранения.