好的,我需要子类化SCNNode,因为我的游戏中有不同的“能力”不同的SCNNode(我知道人们通常不会将SCNNode子类化,但我需要)
我已经关注了Subclassing SCNNode和Creating a subclass of a SCNNode等其他问题 但继续得到这个错误:
fatal error: use of unimplemented initializer 'init()' for class 'LittleDude.Dude'
其中Dude
是我的SCNNode子类的名称。
在第二个问题之后,由于分类问题,我试图从我的.dae场景中获取SCNNode并将其分配给我的Dude()
:
var theDude = Dude(geometry: SCNSphere(radius: 0.1)) //random geometry first
var modelScene = SCNScene(named: "art.scnassets/ryderFinal3.dae")!
if let d = modelScene.rootNode.childNodes.first
{
theDude.transform = d.transform
theDude.geometry = d.geometry
theDude.rotation = d.rotation
theDude.position = d.position
theDude.boundingBox = d.boundingBox
theDude.geometry?.firstMaterial = d.geometry?.firstMaterial
}
print("DUDE: ", theDude)
然后在我的Dude课程中:
class Dude: SCNNode {
init(geometry: SCNGeometry) {
super.init()
center(node: self)
self.scale = SCNVector3(x: modifier, y: modifier, z: modifier)
//theDude.transform = SCNMatrix4Mult(theDude.transform, SCNMatrix4MakeRotation(360, 0, 1, 0))
//theDude.worldOrientation = .
//self.theDude.position = SCNVector3Make(0, 0, -1)
for s in animScenes {
if let anim = animationFromSceneNamed(path: s)
{
animations.append(anim)
anim.usesSceneTimeBase = true
anim.repeatCount = Float.infinity
self.addAnimation(anim, forKey: anim.description)
}
}
}
}
/* Xcode required this */
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented222")
}
当我尝试克隆并将自定义SCNNode添加到我的场景时,会在此自定义类的第一行绘制错误:
func makeDude(hitPosition: SCNVector3) {
//print("DUDE")
let clone = theDude.clone() as? SCNNode
clone?.position = hitPosition
self.sceneView.scene.rootNode.addChildNode(clone!)
}
即使我转向SCNNode试图避免错误。如何在场景中克隆和使用我的自定义SCNNode?这有什么不对?
答案 0 :(得分:0)
如果您继承SCNNode并覆盖其初始化程序init(geometry: SCNGeometry?)
,那么您需要在初始化期间调用相同的super的初始化程序。尝试更改
super.init()
到
super.init(geometry: geometry)
答案 1 :(得分:0)
请明确说明,此答案隐藏在上一个答案的注释中,因此,为了避免混淆,请完整说明答案:
class NodeSubClass: SCNNode {
init(geometry: SCNGeometry?){
super.init()
self.geometry = geometry
}
...
}