多次添加 SCNNode 仅显示一次



我正在尝试在不同位置的循环中添加 SCNNode 多个时间,但我可以在最后一个位置立即看到相同类型的节点。

下面是代码

let entityArray:[entity] = [.coin, .coin, .coin, .brick, .coin, .coin, .coin, .brick]
func setupworld() {
    let scene = SCNScene(named: "art.scnassets/MainScene.scn")!
    var zPosition = -10
    var count = 0
    let delta = -4
    for entity in entityArray {
        var node = SCNNode()
        switch entity {
        case .coin:
            node = scene.rootNode.childNode(withName: "coin", recursively: true) ?? node
            node.position = SCNVector3(0, -5, zPosition)
        case .brick:
            node = scene.rootNode.childNode(withName: "brick", recursively: true) ?? node
            node.position = SCNVector3(0, 0, zPosition)
        }
        self.sceneView.scene.rootNode.addChildNode(node)
        zPosition += delta
        count += 1
    }
}

它显示了最后位置的一枚硬币和一块砖。

我是 scenekit 的新手,所以会做错一些事情,请帮助我。

基于其他评论,正如@rmaddy所说,SCNNode具有clone()功能(这是您应该在此处采用的方法(,并且简单地:

创建节点及其子节点的副本。

但是,使用它时需要注意的一件事是,每个cloned Node将共享相同的几何形状和材料。

也就是说,如果你想在任何时候有一些红色的砖块和一些绿色的砖块,你将无法用这种方法做到这一点,因为:

对附加到一个节点的对象进行更改将影响 共享相同附件的其他节点。

为此,例如,使用不同的材质渲染节点的两个副本,您必须在分配新材质之前复制节点及其几何体,您可以在此处阅读更多信息: 苹果讨论

你只看到硬币或砖块的一个实例的原因是,每次循环迭代时,你都在说新创建的节点等于硬币或砖块,所以自然而然地,该循环中的最后一个元素将是引用场景中该元素的元素。

将其付诸实践并因此解决您的问题,您的setupWorld function应如下所示:

/// Sets Up The Coins & Bricks
func setupworld(){
    //1. Get Our SCNScene
    guard let scene = SCNScene(named: "art.scnassets/MainScene.scn") else { return }
    //2. Store The ZPosition
    var zPosition =  -10
    //3. Store The Delta
    let delta = -4
    //4. Get The SCNNodes We Wish To Clone
    guard let validCoin = scene.rootNode.childNode(withName: "coin", recursively: true),
           let validBrick = scene.rootNode.childNode(withName: "brick", recursively: true) else { return }
    //5. Loop Through The Entity Array & Create Our Nodes Dynamically
    var count = 0
    for entity in entityArray {
        var node = SCNNode()
        switch entity{
        case .coin:
            //Clone The Coin Node
            node = validCoin.clone()
            node.position = SCNVector3(0, -5, zPosition)
        case .brick:
            //Clone The Brick Node
            node = validBrick.clone()
            node.position = SCNVector3(0, 0, zPosition)
        }
        //6. Add It To The Scene
        self.sceneView.scene.rootNode.addChildNode(node)
        //7. Adjust The zPosition
        zPosition += delta
        count += 1
    }
}

相关内容

  • 没有找到相关文章

最新更新