我有一个带有相机设置的SCNScene子类,我想在所有子类中使用这些子类。
let scene01 = TheSubclassScene()
let scene02 = TheSubclassScene(named:"art.scnassets/testScene.scn")!
self.sceneArray.addObject(scene01)
self.sceneArray.addObject(scene02)我想在运行时改变场景。当我用代码创建场景时,这是可行的,而不是使用SceneKit编辑器中的场景。在调试器中,我可以看到数组中的两个场景。一个是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)
}
}发布于 2015-11-24 00:38:27
我有办法解决这个问题。不太好但很管用。我实例化一个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())发布于 2015-11-24 13:00:40
.scn文件只是使用NSKeyedArchiver存档并写入磁盘的SCNScene实例。+ sceneNamed:所做的就是简单地用一个NSKeyedUnarchiver解压缩场景。
然后,您可以尝试使用- setClass:forClassName:来实例化一个子类,而不是一个SCNScene。
尽管如此,SCNScene并不是真正的子类。相反,您可以在视图控制器或游戏控制器(可能是NSObject的直接子类)中实现您的逻辑。这个控制器也可能遵循SCNSceneRendererDelegate来实现游戏逻辑。
发布于 2015-11-23 23:45:21
注意:不要给自定义子类以“SCN”开头的名称;该前缀是Apple的前缀。
我看到的唯一不同之处是调用SCNSceneSubclass(named:) vs SCNSceneSubclass()。在没有看到您的代码的情况下,我的预感是您的SCNSceneSubclass(named:)实现没有调用子类的初始化,因此错过了一些关键步骤。
我们能看一下你子类的源代码吗?
https://stackoverflow.com/questions/33881677
复制相似问题