Sprite kit GameViewController中unarchiveFromFile的方法用于什么?

Sprite kit GameViewController中unarchiveFromFile的方法用于什么?,sprite-kit,viewcontroller,skscene,Sprite Kit,Viewcontroller,Skscene,当我试图在Swift中为游戏添加不同的场景时,我遇到了unarchiveFromFile方法。这个方法的问题是它只适用于GameSecene类。如果你从 extension SKNode { class func unarchiveFromFile(file : NSString) -> SKNode? { if let path = NSBundle.mainBundle().pathForResource(file, ofType: "sks") {

当我试图在Swift中为游戏添加不同的场景时,我遇到了unarchiveFromFile方法。这个方法的问题是它只适用于GameSecene类。如果你从

extension SKNode {
    class func unarchiveFromFile(file : NSString) -> SKNode? {
        if let path = NSBundle.mainBundle().pathForResource(file, ofType: "sks") {
            var sceneData = NSData.dataWithContentsOfFile(path, options: .DataReadingMappedIfSafe, error: nil)
            var archiver = NSKeyedUnarchiver(forReadingWithData: sceneData)

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

class GameViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        if let scene = GameScene.unarchiveFromFile("GameScene") as? GameScene {
             let skView = self.view as SKView
             skView.ignoresSiblingOrder = true
             skView.presentScene(scene)
        }
        // This won't work for MenuScene.unarchiveFromFile("MenuScene") as? MenuScene
        // nor MenuScene.unarchiveFromFile("MenuScene") as? GameScene
为了能够与其他SKScene一起工作,我将所有出现的类GameSecene更改为SKScene。虽然它现在可以与其他SKScene类一起使用,但我仍然不明白它是什么


这是什么方法?我应该保留它吗?

我没有太多地使用Xcode 6,但以下是我的理解(有人可能会纠正我或解释):

这就是你的应用程序如何利用游戏场景(或任何
SKScene
)的布局数据等。如果单击“项目导航器”面板中的GameSecene.sks文件,您将获得游戏场景的可视化编辑器


如果希望使用此布局数据,则可以使用该方法。您可以在场景编辑器中直观地布局游戏场景,而无需对位置、设置等进行编码。

根据0x141E的注释,您可以将unarchiveFromFile方法更改为可用于不同的SKS或SKScene类:

extension SKNode {
    class func unarchiveFromFile<T:SKScene>(file : NSString) -> T? {
        if let path = NSBundle.mainBundle().pathForResource(file, ofType: "sks") {
            var sceneData = NSData(contentsOfFile: path, options: .DataReadingMappedIfSafe, error: nil)!
            var archiver = NSKeyedUnarchiver(forReadingWithData: sceneData)

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

我明白了,游戏中的一切都是动态的,所以我无法真正了解.sks文件的用途,只是简单地删除了它们。如果我决定使用它们,我会记住这一点。如果您仔细查看可以拖放到场景中的元素并修改给定元素的设置,我想您可能会发现它很有用。像发射器、弹簧、重力场、湍流场等,看起来很有希望,尽管在我的测试版中某些东西似乎不起作用。(或者我在设置方面遗漏了一些东西)如果你要开发愤怒的小鸟游戏,你可以从构建不同级别的代码开始。您需要设置背景,选择并定位要发射的鸟类,建造保护清管器的结构,并将清管器放置在适当的位置。想象一下,在100个级别的代码中完成这一切。苹果提供了一种通过SpriteKit模板和SpriteKit编辑器以图形方式设置关卡的方法。它们一起允许你将场景内容(GameSecene.sks)和游戏逻辑(GameSecene.m)分开。我理解。我打算尝试实现一个tilemap。使用sks文件创建游戏地图实用吗??
if let scene = GameScene.unarchiveFromFile("Level1Scene") as? GameScene {
...

if let scene = GameScene.unarchiveFromFile("Level2Scene") as? GameScene {
...