swift - 多次添加 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 所说,anSCNNode
有一个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
}
}
推荐阅读
- oracle-adf - 在 ADF 表中启用滚动+分页
- sql - 如果 subId 是其他项目的 id,则从同一个表中检索数据
- ios - 更新按钮标题
- python-2.7 - 为什么我得到一个无限循环?[Python 2.7]
- python - 程序一直在无限函数中循环?
- asp.net-mvc - Json 格式的 web api 的结果应该只返回特定的数据
- postgresql - 为什么postgres容器在Gitlab CI中忽略/docker-entrypoint-initdb.d/*
- python-2.7 - Python 2 - 除法乘以 10 每次返回 0
- excel - 如何在不将值转换为公式的情况下更改 Power Query 中的参数?
- arrays - 如何使用Java中文本文件中的元素对平均标记进行排序