我试图在不同位置的循环中添加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的新手,所以会做错事,请帮帮我。
答案 0 :(得分:1)
在其他评论的基础上,正如@rmaddy所说,SCNNode
有一个clone()
函数(这是你应该采取的方法),简单地说:
创建节点及其子节点的副本。
然而,在使用它时需要注意的一点是,每个cloned Node
将共享相同的几何和材质。
这就是说,如果你想在任何一点上都有一些红色的砖和一些绿色的砖你将不能用这种方法做到这一点,因为:
对附加到一个节点的对象的更改将会影响 其他共享相同附件的节点。
实现这一点,例如要使用不同的材质渲染节点的两个副本,您必须在分配新材料之前复制节点及其几何体,您可以在此处详细了解:Apple Discussion
你只看到硬币或砖块的一个实例的原因是因为每次你在循环中迭代你都说新创建的节点等于硬币或砖块,所以自然是最后一个该循环中的元素将是从场景中引用该元素的元素。
将此问题付诸实践并解决您的问题,您的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
}
}