ios - 如何重命名 iOS SpriteKit 模板中的默认场景?

标签 ios swift xcode sprite-kit swift3

我对 Swift 和 iOS 开发都很陌生。

我一直在开发一款基于 Apple 的 SpriteKit(集成了 GameplayKit)模板的游戏。

一切正常,直到我将 GameScene.swift 和 GameScene.sks 重命名为 MapMainScene.swift 和 MapMainScene.sks。我确保在 GameViewController.swift 中更改此代码:

override func viewDidLoad() {
    super.viewDidLoad()

    // Load 'GameScene.sks' as a GKScene. This provides gameplay related content
    // including entities and graphs.
    if let scene = GKScene(fileNamed: "GameScene") {

        // Get the SKScene from the loaded GKScene
        if let sceneNode = scene.rootNode as! GameScene? {

            // Copy gameplay related content over to the scene
            sceneNode.entities = scene.entities
            sceneNode.graphs = scene.graphs

            // Set the scale mode to scale to fit the window
            sceneNode.scaleMode = .aspectFill

            // Present the scene
            if let view = self.view as! SKView? {
                view.presentScene(sceneNode)

                view.ignoresSiblingOrder = true

                view.showsFPS = true
                view.showsNodeCount = true
            }
        }
    }
}

到:

override func viewDidLoad() {
    super.viewDidLoad()

    // Load 'MainMapScene.sks' as a GKScene. This provides gameplay related content
    // including entities and graphs.
    if let scene = GKScene(fileNamed: "MainMapScene") {

        // Get the SKScene from the loaded GKScene
        if let sceneNode = scene.rootNode as! MainMapScene? {

            // Copy gameplay related content over to the scene
            sceneNode.entities = scene.entities
            sceneNode.graphs = scene.graphs

            // Set the scale mode to scale to fit the window
            sceneNode.scaleMode = .aspectFill

            // Present the scene
            if let view = self.view as! SKView? {
                view.presentScene(sceneNode)

                view.ignoresSiblingOrder = true

                view.showsFPS = true
                view.showsNodeCount = true
            }
        }
    }
}

我还在 Gamescene.swift 中更改了以下内容:

class GameScene: SKScene {
    // Some code
}

MainMapScene.swift 中:

class MainMapScene: SKScene {
    // Some code
}

但应用程序在启动时崩溃。控制台的输出显示:

2016-07-21 16:29:35.593592 MyGame[10656:1944648] [User Defaults] CFPrefsPlistSource<0x6080000e5e00> (Domain: kCFPreferencesAnyApplication, User: kCFPreferencesCurrentUser, ByHost: No, Container: (null)) is waiting for writes to complete so it can determine if new data is available
2016-07-21 16:29:35.603729 MyGame[10656:1944648] [FenceWorkspace] creating a CA fence port (5d13)
2016-07-21 16:29:35.638 MyGame[10656:1944648] *** Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException', reason: '*** -[NSKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class (GameScene) for key (root); the class may be defined in source code or a library that is not linked'
*** First throw call stack:

所以看起来我的项目中某处仍然有对 GameScene 的引用,但我已经在整个项目范围内进行了搜索,但在任何地方都找不到 GameScene .

我敢肯定这是一件非常简单的事情。我需要在 Storyboard 编辑器中更改导出或其他内容吗?我也可以通过尝试在新项目中更改 GameScene 的名称来重现此问题,因此我知道这不是我的项目所特有的。

最佳答案

GameScene 实际上在一个地方被引用,来自 NSKeyedArchiver 的错误应该提示您在哪里:它被编码在 .sks 您正在加载的文件。您可以在 Xcode 编辑器的 .sks 文件的“自定义类”选项卡中找到它。

Custom Class Tab

此设置告诉 NSKeyedUnarchiver 当您加载 .sks 文件时编码场景应该是什么类。这应该是对 GameScene 的最后剩余引用,所以这应该完成您的重命名!

关于ios - 如何重命名 iOS SpriteKit 模板中的默认场景?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38508563/

相关文章:

javascript - 如何将 Phaser 游戏上架 iOS App Store?

ios - 从解析查询获取 tableView 中的值的延迟

ios - Xcode 7 中的 CoreData 类

ios - 如何将 JSON 提取到 Swift 到 tableView 作为部分和行?

swift - 延迟更改分数

iOS:安装.ipa

ios - 在文件中包含 Xcode 中的警告(Objective-C 项目)

ios - 更改 uitabbar 项目图像的按钮

android - Flutter:如何将 RefreshIndicator 与 SliverAppBar 一起使用

ios - ARKit 中转换的远处物体