子类化SCNScene和SceneKit编辑器

我有SCNScene子类与相机设置,我想在所有的子类中使用。

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

我想在运行时改变场景。 当我在代码中创build场景时,这种方法起作用,但不能从SceneKit编辑器中使用场景。 所以scene01正在工作,但scene02不是。 在debugging器中,我可以看到数组中的两个场景。 一个是SCNSceneSubclasstypes,另一个是SCNScenetypes。

有没有办法让这个工作?

更新:这是我的场景子类

 class TheSubclassScene: SCNScene { let cameraNode = CameraNode() override init() { super.init() self.rootNode.addChildNode(self.cameraNode) } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } } 

我有一个解决这个问题的方法。 不好,但它的作品。 我实例化一个SCNScene(named: "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实例。 What + sceneNamed:所做的只不过是用NSKeyedUnarchiver将场景取消存档。

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

这就是说, SCNScene并不是真的意味着被分类。 相反,你可以在视图控制器或游戏控制器(可能是NSObject的直接子类)中实现你的逻辑。 这个控制器也可能符合SCNSceneRendererDelegate来实现你的游戏逻辑。

注意:不要给你的自定义子类一个以“SCN”开头的名字; 该前缀是针对Apple的。

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

我们能否看到你的子类的源代码?