场景工具包:如何在运行时从其他场景加载节点?



我有主场景文件:main.scn和其他几个场景文件,其中包含额外的SCNNodes:scene1.scnscene2.scnscene3.scn,...在应用程序启动时,我从scene1.scn加载所需的节点并将它们添加到main.scn(显示在屏幕上)。在运行时,我需要从其他sceneN.scn文件添加其他节点。我尝试了两种方法,每种方法都没有使用:

1)renderer(_, updateAtTime)里面,我只加载所需的节点:

func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) {
let scene2 = SCNScene(named: "game.scnassets/scene2.scn")!
let node = scene2.rootNode.childNode(withName: "nodeName", recursively: false)!
mainScene.rootNode.addChildNode(node)
}

在这种情况下,我收到错误:[场景套件] 错误:在另一个场景的渲染回调中修改了场景 ()。这是不允许的,可能会导致崩溃

2)在后台加载场景2和节点,将其添加到数组nodesToShow内部renderer(_, updateAtTime)显示数组中的节点。在这种情况下,有时我会收到错误:

com.apple.scenekit.scnview-renderer (17): EXC_BAD_ACCESS (code=1, address=0xf000000010a10c10)

您可能知道一些真正的解决方案,可以在运行时从其他场景文件加载和呈现节点?

您可以使用 SCNReferenceNode 从另一个场景文件加载内容:

一个场景图节点,用作要从单独的场景文件加载内容的占位符。

然后,您应该将.load()命令括在 SCNTransaction 块中以创建原子更新:

此事务对在该线程的运行循环的当前迭代期间从同一线程所做的任何其他更改进行分组。当运行循环下次迭代时,SceneKit 会自动提交事务,以原子方式将事务期间所做的所有更改应用于演示场景图(即当前正在显示的场景图的版本)。

斯威夫特代码:

let url = Bundle.main.url(forResource: "ship", withExtension: "scn", subdirectory: "art.scnassets")!
let referenceNode = SCNReferenceNode(url: url)!
scnView.scene!.rootNode.addChildNode(referenceNode)
SCNTransaction.begin()
referenceNode.load()
SCNTransaction.commit()

相关内容

最新更新