12

(this is for XCode 6 and iOS 8 beta 4)

Love the new SceneKit editor. I'm successfully loading the scene from .sks file into a custom SKScene class. However, objects inside it are instantiated as default classes (SKNode, SKSpriteNode, etc), and i'm not sure how to bind them to be instantiated as custom subclasses instead.

Currently, I'm getting around that by creating custom classes and linking to sprite nodes as a property, and that works ok

4

4 に答える 4

4

これに対処するために、小さなヘルパー デリゲートを作成しました: https://github.com/ice3-software/node-archive-delegate。を使用してNSKeyedUnarchiverDelegate、スプライトを名前でサブクラス化します。

于 2015-03-23T10:59:46.157 に答える
3

SceneKit エディターの使い方をちょっとしたトリックを作ったので、使ってみますが、これがどのようにパフォーマンスを低下させるのかわかりません。シーン エディターを使用して複雑な SKNodes 構造を作成し、それらを現在のシーンにロードしたいと考えています。ノードのサブクラス化にも役立ちます。

シーン エディターでノードを構成し、親ノードを "base" という空のノードとして設定し、SKNode のサブクラスを作成しました。次に、init メソッドを作成し、シーンで必要なときに呼び出します。

// subclass code
class MyOwnSKNodeSubclass: SKNode {

let nodeLayer = SKNode()

   init(fromNode: SKNode){
       super.init()

       nodeLayer.addChild(fromNode.childNodeWithName("base").copy() as SKNode)
       addChild(nodeLayer)
   }
}



// scene code
if let myNode = SKNode.unarchiveNodeFromFile("MyScene")
{
   // you can use your subclass here
   let node = MyOwnSKNodeSubclass(fromNode: myNode)

   addChild(node)
}

大きな違いはありませんが、独自の SKNode 拡張機能も使用しました。

class func unarchiveNodeFromFile(file:String) -> SKNode?{

    if let path = NSBundle.mainBundle().pathForResource(file, ofType: "sks") {
        var nodeData = NSData.dataWithContentsOfFile(path, options: .DataReadingMappedIfSafe, error: nil)
        var archiver = NSKeyedUnarchiver(forReadingWithData: nodeData)

        archiver.setClass(self.classForKeyedUnarchiver(), forClassName: "SKNode")
        let scene = archiver.decodeObjectForKey(NSKeyedArchiveRootObjectKey) as SKNode
        archiver.finishDecoding()
        return scene
    } else {
        return nil
    }
}

私が言ったように、生産性についてはよくわかりませんが、これを頻繁に使用しなければ、それほど害はないと思います。これが誰かに役立つことを願っています。

于 2014-08-29T20:51:25.973 に答える