嗨,我试图从我的场景工具包场景中删除所有节点,但我不能为我的生活找出一个方法。在我看来,一定有一个自动执行此操作的函数是合乎逻辑的,但我找不到它。在上下文中,我尝试删除所有节点,这样我就可以重置我的场景,这会相当频繁地发生。也许有另一种方法可以做到这一点,我会很好,我不坚持必须删除所有节点。谢谢!
5ssjco0h1#
尝试以下操作(假设您使用的是Swift):
rootNode.enumerateChildNodes { (node, stop) in node.removeFromParentNode() }
对我有用。
tzdcorbm2#
对我来说,工作如下:
sceneView.scene.rootNode.enumerateChildNodes { (node, stop) in node.removeFromParentNode() }
alen0pnh3#
可以创建新场景,也可以在场景的rootNode的每个子节点上调用-[SCNNode removeFromParentNode]
rootNode
-[SCNNode removeFromParentNode]
jjjwad0x4#
在需要移除所有节点的位置,调用以下命令(如果场景不是self,请更改它):
self
for (SCNNode *node in [self children]) { [node removeFromParent] }
此外,如果您需要删除每个节点**(除了某些**),则调用此函数(例如,我们不想删除3个节点,它们的名称分别为a、b和c)
a
b
c
for (SCNNode *node in [self children]) { if (![node.name isEqualToString:@"a"] && ![node.name isEqualToString:@"b"] && ![node.name isEqualToString:@"c"]) { [node removeFromParent] } }
希望这有帮助!
r55awzrz5#
这里是一个Objective-C的解决方案(是的,它仍然存在!)
while (self.sceneView.scene.rootNode.childNodes.count) { NSArray<SCNNode *> *nodes = self.sceneView.scene.rootNode.childNodes; [nodes[0] removeFromParentNode]; }
disho6za6#
在循环访问集合时修改集合不是一种好的做法;这里有一个替代方法:
while let n = node.childNodes.first { n.removeFromParentNode() }
ckocjqey7#
出于某种原因,我能找到的关于这个主题的每一个答案都包含SCNNode.enumerateChildNodes方法,但使用它有一个明显的缺点--它是异步的,这意味着当节点的所有子节点都被删除时,你不能得到通知。幸运的是,有一种更健壮的方法利用了childNodes(passingTest:)方法,它基本上允许你检索所有满足条件的节点,同步地。因此,移除所有子节点可以通过两个步骤实现:
SCNNode.enumerateChildNodes
// baseNode: SCNNode is defined somewhere in your code // 1. retrieve all child nodes let allChildNodes = baseNode.childNodes { _, _ in true } // 2. remove nodes from their parent for childNode in allChildNodes { childNode.removeFromParentNode() }
注意,我们可以使用代码块的第一个参数进行更高级的过滤--比如根据名称、内容等选择节点。
zmeyuzjn8#
我发现从场景中移除所有节点的最简单方法是:
self.removeAllChildren()
在XCode 7.2版中,这对我来说非常有效
8条答案
按热度按时间5ssjco0h1#
尝试以下操作(假设您使用的是Swift):
对我有用。
tzdcorbm2#
对我来说,工作如下:
alen0pnh3#
可以创建新场景,也可以在场景的
rootNode
的每个子节点上调用-[SCNNode removeFromParentNode]
jjjwad0x4#
在需要移除所有节点的位置,调用以下命令(如果场景不是
self
,请更改它):此外,如果您需要删除每个节点**(除了某些**),则调用此函数(例如,我们不想删除3个节点,它们的名称分别为
a
、b
和c
)希望这有帮助!
r55awzrz5#
这里是一个Objective-C的解决方案(是的,它仍然存在!)
disho6za6#
在循环访问集合时修改集合不是一种好的做法;这里有一个替代方法:
ckocjqey7#
出于某种原因,我能找到的关于这个主题的每一个答案都包含
SCNNode.enumerateChildNodes
方法,但使用它有一个明显的缺点--它是异步的,这意味着当节点的所有子节点都被删除时,你不能得到通知。幸运的是,有一种更健壮的方法利用了childNodes(passingTest:)方法,它基本上允许你检索所有满足条件的节点,同步地。
因此,移除所有子节点可以通过两个步骤实现:
注意,我们可以使用代码块的第一个参数进行更高级的过滤--比如根据名称、内容等选择节点。
zmeyuzjn8#
我发现从场景中移除所有节点的最简单方法是:
在XCode 7.2版中,这对我来说非常有效