Swift:不能子类化SCNNode? Fatalerror

时间:2017-09-11 23:14:41

标签: ios swift scenekit arkit scnnode

好的,我需要子类化SCNNode,因为我的游戏中有不同的“能力”不同的SCNNode(我知道人们通常不会将SCNNode子类化,但我需要)

我已经关注了Subclassing SCNNodeCreating 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?这有什么不对?

2 个答案:

答案 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
    }

...

}