簡體   English   中英

子類化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)
    }
}

我有一個解決該問題的方法。 不好,但是可以。 我實例化一個SCNScene(named: "art.scnassets/testScene.scn")然后實例化TheSubclassScene()然后克隆場景的TheSubclassScene()並將其作為子節點添加到子類場景。

let testScene = SCNScene(named:"art.scnassets/testScene.scn")!
let subclassScene = TheSubclassScene()
subclassScene.rootNode.addChildNode(testScene.rootNode.clone())

.scn文件只是使用NSKeyedArchiver存檔並寫入磁盤的SCNScene實例。 + sceneNamed:作用是使用NSKeyedUnarchiver簡單地取消存檔場景。

然后,您可以嘗試使用- setClass:forClassName:實例化一個子類而不是SCNScene

話雖如此, SCNScene並不是真的要被子類化。 相反,您可以在視圖控制器或游戲控制器(可能是NSObject的直接子類)中實現邏輯。 該控制器也可能會遵循SCNSceneRendererDelegate來實現您的游戲邏輯。

注意:不要給您的自定義子類一個以“ SCN”開頭的名稱; 該前綴用於Apple。

我唯一看到的區別是調用SCNSceneSubclass(named:) vs SCNSceneSubclass() 沒有看到您的代碼,我的直覺是您對SCNSceneSubclass(named:)實現不會調用子類的初始化,因此會錯過一些關鍵步驟。

我們可以看到您的子類的源代碼嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM