使用.sks文件来布局复杂的对象与SKScene文件

是否可以使用SceneEditor来布局和创buildSKSpriteNode的复杂子类,根据sks文件加载信息并在场景中创build自定义对象?

我的场景是我有一个popup式对话框(它们只不过是SKSpriteNodes的子类),在对话框中有很多子对象。 我希望把它放在场景编辑器中,类似于我如何布置SKScene,然后在需要时将其呈现在场景中。

我意识到我可以在我的GameScene.sks文件中创build这个对象,但是发现这些对象可能会变得非常混乱,并且认为如果每个对象都有自己的sks文件,可能会更好地存储这些对象。

我试过扩展SKSpriteNode来访问文件类似于场景文件,但它没有工作

if let teamDialog = SKSpriteNode.spriteWithClassNamed(className: "TeamDialog", fileName: "TeamDialog.sks") { } extension SKSpriteNode { static func spriteWithClassNamed(className: String, fileName: String) -> SKSpriteNode? { guard let dialog = SKSpriteNode(fileNamed: fileName) else { return nil } return dialog } } 

在这里输入图像说明

你可以使用这个委托https://github.com/ice3-software/node-archive-delegate

或者,快速地这样smt:

 class func unarchiveNodeFromFile(file:String)-> SKNode? { if let path = NSBundle.mainBundle().pathForResource(file, ofType: "sks") { var fileData = NSData.dataWithContentsOfFile(path, options: NSDataReadingOptions.DataReadingMappedIfSafe, error: nil) var archiver = NSKeyedUnarchiver(forReadingWithData: fileData) archiver.setClass(self.classForKeyedUnarchiver(), forClassName: "SKNode") let node = archiver.decodeObjectForKey(NSKeyedArchiveRootObjectKey) as SKNode archiver.finishDecoding() return node } else { return nil } } 

更新Swift 3和修复类的铸造:

 func unarchiveNodeFromFile(file:String)-> SKNode? { if let path = Bundle.main.path(forResource: file, ofType: "sks") { let fileData = NSData.init(contentsOfFile: path) let archiver = NSKeyedUnarchiver.init(forReadingWith: fileData as Data!) archiver.setClass(SKNode.classForKeyedUnarchiver(), forClassName: "SKScene") let node = archiver.decodeObject(forKey: NSKeyedArchiveRootObjectKey) as! SKNode archiver.finishDecoding() return node } else { return nil } }