首页 文章

SceneKit 的 node.childNode(withname:recursively:)在 iOS 11 上找到节点,但不是 9 或 10

提问于
浏览
0

我有一个相当简单的 SceneKit .scn,它包含几个灯和几个摄像头以及来自同一.scnassets捆绑包中的.dae文件的参考节点。

在 iOS 11(真实或模拟器)上,场景正确加载。在 9(真的,我没有该版本的模拟器)或 10(真实或模拟器)scene.rootNode.childNode(withName: "MyNodeName", recursively: true)返回 nil。

加载.dae将节点“MyNodeName”作为其自身的场景提供成功,因此将其作为资产包的一部分进行复制。

我知道一些 SceneKit 功能是最近添加的,但根据文档,此方法自 iOS 8 以来就已存在。参考节点的Load Policy设置为Immediately(在 Interface Builder 的节点检查器中)。

有什么可以解释这种行为?

编辑补充:

尽管 Interface Builder 中的加载策略设置,iOS 9 和 10 似乎不会自动加载参考节点:

在尝试查找子节点时,在 iOS 10 上:

(lldb) p scene.rootNode.childNodes.map { $0.name }
([String?]) $R1 = 3 values {
  [0] = "Reference node"
  [1] = "Cameras"
  [2] = "Lights"
}
(lldb) p scene.rootNode.childNodes[0].childNodes.map { $0.name }
([String?]) $R2 = 0 values {}
(lldb)

同一时刻,在 iOS 11 上:

(lldb) p scene.rootNode.childNodes.map { $0.name }
([String?]) $R11 = 3 values {
  [0] = "Reference node"
  [1] = "Cameras"
  [2] = "Lights"
}
(lldb) p scene.rootNode.childNodes[0].childNodes.map { $0.name }
([String?]) $R10 = 1 value {
  [0] = "Actual node"
}

有没有办法强制场景加载它的参考节点?对于场景或根节点,我在文档中都找不到任何内容。如果没有,那么场景中的参考节点似乎对 iOS <11 没有用。

1 回答

  • 0

    似乎 replacing/updating _11_对于 SceneKit 编辑器或 iOS 11(模拟或真实)来说没有问题,iOS 9 和 10 都被引用节点的方式所迷惑,导致它们无法找到它。

    删除和 re-creating 主场景中的参考节点是解决方案。

相关问题