子类化 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
以实现您的游戏逻辑。
我有一个带有相机设置的 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
以实现您的游戏逻辑。