【问题标题】:Swift: Can't subclass SCNNode? Fatalerror斯威夫特:不能继承 SCNNode?致命错误
【发布时间】:2018-02-20 06:40:51
【问题描述】:

好的,我需要子类化 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?这里有什么问题?

【问题讨论】:

  • 看起来运行时正在寻找一个声明为init() 的函数(即没有参数)。作为一个实验,当您复制当前的 init(geometry: SCNGeometry) 并简单地将声明重命名为 init() 时会发生什么?
  • 在某种程度上就是这样。

标签: ios swift scenekit arkit scnnode


【解决方案1】:

如果您将 SCNNode 子类化并覆盖其初始化程序init(geometry: SCNGeometry?),那么您将需要在初始化期间调用相同的 super 初始化程序。尝试改变

super.init()

super.init(geometry: geometry)

【讨论】:

  • 我认为这也是正确的方法,但在 Xcode 10 中这会导致“必须调用指定的初始化程序”错误。
  • Ash,尝试调用super.init(),然后手动分配几何:self.geometry = geometry
【解决方案2】:

为了清楚起见,这个答案隐藏在先前答案的 cmets 中,所以为了避免混淆,这里将答案完全拼写出来:


class NodeSubClass: SCNNode {

init(geometry: SCNGeometry?){
        super.init()
        self.geometry = geometry
    }

...

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-26
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    • 2017-03-24
    • 2019-09-13
    • 2016-10-21
    • 1970-01-01
    相关资源
    最近更新 更多