多次添加 SCNNode 只显示一次
Posted
技术标签:
【中文标题】多次添加 SCNNode 只显示一次【英文标题】:Adding SCNNode multiple time shows only once 【发布时间】:2018-10-09 12:42:32 【问题描述】:我正在尝试在不同位置的循环中添加 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的新手,所以会做错事,请帮助我。
【问题讨论】:
你试过给他们不同的“名字”吗? 你不断地添加同一个节点。一个节点只能添加一次。 我对 SceneKit 几乎一无所知,但在SCNNode
上有一个 clone
函数。
我看了一件事,我以为你使用新的初始化节点来设置和添加,就像@rmaddy说的那样,你不应该再使用同一个节点,正确的做法是使用你的那个初始化并正确配置
var node = SCNNode() 进行初始化,问题是: node = scene.rootNode.childNode(withName: "coin", recursive: true) ??您每次检索现有节点的节点...
【参考方案1】:
在其他 cmets 的基础上,正如 @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
【讨论】:
感谢您编辑我的代码并解释一切:) 很高兴它有帮助:)以上是关于多次添加 SCNNode 只显示一次的主要内容,如果未能解决你的问题,请参考以下文章