gpt4 book ai didi

swift - 多次添加SCNNode只显示一次

转载 作者:行者123 更新时间:2023-11-28 14:48:07 25 4
gpt4 key购买 nike

我试图在不同位置的循环中添加 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
}
}

它在最后位置显示一枚硬币和一 block 砖。

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

最佳答案

基于其他评论,正如@rmaddy 所说,SCNNode 有一个clone() 函数(这是您应该在此处采用的方法),这很简单:

Creates a copy of the node and its children.

然而,使用它时要注意的一件事是,每个克隆节点 将共享相同的几何形状和 Material 。

也就是说,如果您在任何时候想要一些砖 block 是红色的,一些砖 block 是绿色的,您将无法使用此方法来实现,因为:

changes to the objects attached to one node will affect other nodes that share the same attachments.

为了实现这个,例如要使用不同 Material 渲染节点的两个副本,您必须在分配新 Material 之前同时复制节点及其几何体,您可以在此处阅读更多相关信息:Apple Discussion

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

将其付诸实践并解决您的问题,您的 setupWorld 函数 应该如下所示:

/// 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
}

}

关于swift - 多次添加SCNNode只显示一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50083244/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com