是否可以使用SceneEditor进行布局和放大创建一个复杂的SKSpriteNode子类,加载该信息并根据sks文件在场景中创建自定义对象?
我的场景是我有一个弹出对话框(只不过是SKSpriteNodes的子类),对话框中有很多孩子。我希望在场景编辑器中将其列出类似于我如何布置SKScene,然后在需要时将其呈现在我的场景中。
我意识到我可以在我的GameScene.sks文件中创建这个对象,但发现那些可能很容易混乱,并认为如果每个都有自己的sks文件,它可能是存储这些拨号的更好方法。
我尝试过扩展SKSpriteNode以访问类似于Scene文件的文件,但它不起作用
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
}
}
答案 0 :(得分:1)
您可以使用此委托https://github.com/ice3-software/node-archive-delegate
或者,在swift中像这样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
}
}