【问题标题】:Subclassing SCNScene and SceneKit Editor子类化 SCNScene 和 SceneKit 编辑器
【发布时间】:2016-02-26 04:29:21
【问题描述】:

我有一个带有相机设置的 SCNScene 子类,我想在所有子类中使用它。

let scene01 = TheSubclassScene()
let scene02 = TheSubclassScene(named:"art.scnassets/testScene.scn")!
self.sceneArray.addObject(scene01)
self.sceneArray.addObject(scene02)

我想在运行时更改场景。这适用于我在代码中创建场景但不适用于来自 SceneKit 编辑器的场景。所以scene01 有效,但scene02 无效。在调试器中,我可以看到数组中的两个场景。一个是 SCNSceneSubclass 类型,另一个是 SCNScene 类型。

有什么办法可以让它工作吗?

更新: 这是我的场景子类

class TheSubclassScene: SCNScene
{
    let cameraNode = CameraNode()

    override init()
    {
        super.init()
        self.rootNode.addChildNode(self.cameraNode)
    }

    required init?(coder aDecoder: NSCoder)
    {
        super.init(coder: aDecoder)
    }
}

【问题讨论】:

    标签: ios scenekit


    【解决方案1】:

    我有解决这个问题的方法。不好,但它的工作原理。我实例化一个SCNScene(named: "art.scnassets/testScene.scn"),然后实例化一个TheSubclassScene(),然后克隆场景的rootNode,并将其作为子节点添加到子类场景中。

    let testScene = SCNScene(named:"art.scnassets/testScene.scn")!
    let subclassScene = TheSubclassScene()
    subclassScene.rootNode.addChildNode(testScene.rootNode.clone())
    

    【讨论】:

      【解决方案2】:

      .scn 文件只是使用NSKeyedArchiver 归档并写入磁盘的SCNScene 实例。 + sceneNamed: 所做的只是简单地使用 NSKeyedUnarchiver 取消归档场景。

      那么你可以做的是尝试使用- setClass:forClassName: 来实例化一个子类而不是SCNScene

      话虽如此,SCNScene 并不是真的要被子类化。相反,您可以在视图控制器或游戏控制器(可能是NSObject 的直接子类)中实现您的逻辑。此控制器也可能符合SCNSceneRendererDelegate 来实现您的游戏逻辑。

      【讨论】:

        【解决方案3】:

        注意:不要给您的自定义子类起一个以“SCN”开头的名称;该前缀是苹果的。

        我能看到的唯一区别是调用SCNSceneSubclass(named:)SCNSceneSubclass()。没有看到你的代码,我的直觉是你的SCNSceneSubclass(named:) 实现没有调用你的子类的初始化,因此错过了一些关键步骤。

        我们可以看看你的子类的源代码吗?

        【讨论】:

        • SCNSceneSubclass 只是示例。在我的代码中,它的名称没有 SCN 前缀。子类只是在初始化时添加一个相机节点。
        • 我提供了子类代码。在我看来没有错。有没有办法覆盖便利 init(named name: String) ?也许问题就在那里。
        • 你不必这样称呼它。但我不认为这是问题所在。我们对 testScene.scn 了解多少?它是否有任何您可以在调试器中看到的节点?你能把它加载到一个直接的 SCNScene (不是你的子类)吗?您可以使用 Quicklook 或 Preview 看到它吗?如果将不同的文件加载到子类中会发生什么?
        • testScene 也很好,只是场景中的一个框,我可以将它加载到 SCNScene 中。 Quicklook 也可以。不同的文件,同样的问题。
        猜你喜欢
        • 2016-04-04
        • 2014-12-04
        • 2021-06-02
        • 2017-12-08
        • 2015-09-24
        • 2016-02-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多