Ios 子类化SCNScene和SceneKit编辑器

Ios 子类化SCNScene和SceneKit编辑器,ios,scenekit,Ios,Scenekit,我有一个带有摄像头设置的SCNScene子类,我想在所有子类中使用它 let scene01 = TheSubclassScene() let scene02 = TheSubclassScene(named:"art.scnassets/testScene.scn")! self.sceneArray.addObject(scene01) self.sceneArray.addObject(scene02) 我想在运行时更改场景。当我在代码中创建场景时,这会起作用,但不使用SceneKit编

我有一个带有摄像头设置的SCNScene子类,我想在所有子类中使用它

let scene01 = TheSubclassScene()
let scene02 = TheSubclassScene(named:"art.scnassets/testScene.scn")!
self.sceneArray.addObject(scene01)
self.sceneArray.addObject(scene02)
我想在运行时更改场景。当我在代码中创建场景时,这会起作用,但不使用SceneKit编辑器中的场景。因此
scene01
起作用了,但
scene02
不起作用。在调试器中,我可以看到阵列中的两个场景。一个为SCNScene子类类型,另一个为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”开头的名称;这个前缀是苹果的

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


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

我有一个解决这个问题的方法。不太好,但很管用。我实例化一个
SCNScene(名为:“art.scnassets/testScene.scn”)
,然后实例化一个
TheSubclassScene()
,克隆场景的根节点并将其作为子节点添加到子类场景中

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

.scn
文件只是使用
NSKeyedArchiver
归档并写入磁盘的
SCNScene
实例。
+sceneNamed:
所做的是,它只是使用
nskeyedunachiver
取消对场景的归档

然后,您可以尝试使用
-setClass:forClassName:
来实例化子类,而不是
SCNScene


也就是说,
SCNScene
并不是真正的子类化。相反,您可以在视图控制器或游戏控制器(可能是
NSObject
的直接子类)中实现逻辑。此控制器还可能符合
scnscenerenderdelegate
以实现游戏逻辑。

SCNSceneSubclass只是一个示例。在我的代码中,它有一个没有SCN前缀的名称。子类只是在初始化时添加了一个摄影机节点。我提供了子类代码。在我看来没有什么不对。有没有办法重写便利初始化(命名名称:String)?也许问题就在那里,你不必这么说。但我认为这不是问题所在。我们对testScene.scn了解多少?它是否有可以在调试器中看到的节点?你能把它加载到一个直接的SCNScene(不是你的子类)中吗?您可以使用“快速查看”或“预览”查看它吗?如果将不同的文件加载到子类中会发生什么情况?testScene也很好,只是场景中的一个框,我可以将其加载到SCNScene中。Quicklook也可以工作。不同的文件,相同的问题。