如何在Swift中使用Scene Kit获取所有名称为child的子节点

12
我正在尝试开发一款基础游戏,我的场景有多个子节点添加到根节点。每个节点都有两个名称中的一个,分别为friendenemy
如果用户触摸了其中一个enemy节点,我想删除所有名为enemy的子节点。
我尝试过很多方法,但好像什么都没起作用。
在我的touchesBegan函数中:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
   let touch = touches.first!
   let location = touch.location(in: gameView)
   let hitList = gameView.hitTest(location, options: nil)

   if let hitObject = hitList.first {
      let node = hitObject.node

      //This doesn't work
      gameScene.rootNode.childNodes(passingTest: { (node, UnsafeMutablePointer<ObjCBool>) -> Bool in 
      node.removeFromParentNode()
   } 
}

我也尝试过使用gameScene.rootNode.enumerateChildNodes(withName:),但是我也无法使其工作。

但我可以在其中尝试像这样的操作:

if node.name == "enemy" {
    node.removeFromParentNode()
}

然而这只会移除被选中的单个节点,而不是全部。在Swift和Scene Kit中,我该如何获取所有特定名称的子节点?


枚举子节点,名称为"enemy",使用以下代码块:{ node, _ in } - El Tomato
@ElTomato 这给了我一个错误 调用中有额外的参数'using' - maxshuty
enumerateChildNodes(withName:) 应该可以工作,这里有一个例子:https://stackoverflow.com/a/26748966/1187415 - Martin R
1
@MartinR 我相信 OP 正在使用 SceneKit (SCNNode 实例) 而不是 SpriteKit; 两者通常有重叠之处,但似乎 enumerateChildNodes(withName:using:) 方法对于 SCNNode 并不存在。对于后者,可能可以使用 childNodes(passingTest:),或者只需在 childNodes 属性上调用 filter;尽管我不确定这些是否对于多子层次结构(节点层次深度 > 1)是等效的。 - dfrib
@dfri:这解释了一切,谢谢。 - Martin R
1个回答

13

过滤出名称匹配的节点并将它们从父节点中删除:

gameScene.rootNode.childNodes.filter({ $0.name == "Enemy" }).forEach({ $0.removeFromParentNode() })

@Oskar,你能帮忙看一下这个问题吗?https://stackoverflow.com/questions/57543919/arkit-skvideonode-continue-playing-while-node-is-out-of-scene-pause-is-not-wo - Jamshed Alam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接