子类化 SCNScene 和 SceneKit 编辑器

Subclassing SCNScene and SceneKit Editor

我有一个带有相机设置的 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)
    }
}

注意:不要给您的自定义子类起一个以 "SCN" 开头的名称;该前缀适用于 Apple。

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

我们可以看一下您的子类的源代码吗?

我有解决该问题的方法。不好,但它有效。我实例化一个 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())

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

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

话虽这么说,SCNScene 并不是真正意义上的子类化。相反,您可以在视图控制器或游戏控制器(可能是 NSObject 的直接子类)中实现您的逻辑。此控制器也可能符合 SCNSceneRendererDelegate 以实现您的游戏逻辑。