如何从场景包场景中删除所有节点?

Posted

技术标签:

【中文标题】如何从场景包场景中删除所有节点?【英文标题】:How can I remove all nodes from a scenekit scene? 【发布时间】:2015-04-28 14:23:38 【问题描述】:

您好,我正在尝试从我的 Scenekit 场景中删除所有节点,但我终其一生都想不出办法。

在我看来,必须有一个自动执行此操作的功能,但我找不到它。

在上下文中,我正在尝试删除所有节点,以便我可以重置我的场景,这会经常发生。也许还有另一种方法可以做到这一点,我会很好的,我不必担心必须删除所有节点。

谢谢!

【问题讨论】:

【参考方案1】:

试试这个(假设你使用的是 Swift):

rootNode.enumerateChildNodes  (node, stop) in
        node.removeFromParentNode()
    

为我工作。

【讨论】:

请注意,根据 Cocoa 约定,在枚举集合(子节点)时对其进行变异是程序员的错误。我不建议这样做。【参考方案2】:

对我来说,工作如下:

sceneView.scene.rootNode.enumerateChildNodes  (node, stop) in
node.removeFromParentNode() 

【讨论】:

您也可以跳过暂停会话【参考方案3】:

您可以创建一个新场景或在场景rootNode 的每个子节点上调用-[SCNNode removeFromParentNode]

【讨论】:

我把我接受的答案从这个转移到了艾伦的答案,部分原因是他更清楚,但主要是因为它是我标记问题的快速。【参考方案4】:

如果您需要删除所有节点,请调用它(如果您的场景不是 self,请更改它):

for (SCNNode *node in [self children]) 
    [node removeFromParent]

另外,如果你需要移除每个节点除了一些,调用这个(比如说,我们不想移除3个节点,它们被命名为abc)

for (SCNNode *node in [self children]) 
    if (![node.name isEqualToString:@"a"] && ![node.name isEqualToString:@"b"] && ![node.name isEqualToString:@"c"]) 
        [node removeFromParent]
    

希望这会有所帮助!

【讨论】:

【参考方案5】:

这是 Objective-C 中的一个解决方案(是的,它仍然存在!)

while (self.sceneView.scene.rootNode.childNodes.count) 
    NSArray<SCNNode *> *nodes = self.sceneView.scene.rootNode.childNodes;
    [nodes[0] removeFromParentNode];

【讨论】:

【参考方案6】:

在循环中修改集合不是好的做法;这是另一种选择:

while let n = node.childNodes.first  n.removeFromParentNode() 

【讨论】:

【参考方案7】:

我发现从场景中删除所有节点的最简单方法是:

  self.removeAllChildren()

这在 XCode 7.2 版中对我很有效

【讨论】:

现在SceneKit没有这个方法 因为这不是 SceneKit 而是 SpriteKit 方法

以上是关于如何从场景包场景中删除所有节点?的主要内容,如果未能解决你的问题,请参考以下文章

Stone教程:如何导入3D模型到场景中

使用 SpriteKit 场景编辑器设计复杂对象

如何在 SpriteKit 中一次引用多个 SKNode?

如何在场景之外正确删除节点

cc.Component

Xcode 如何自动从其父节点中删除 skspritenode