Как переименовать сцену по умолчанию в шаблоне iOS SpriteKit?

Я очень новичок в разработке 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
            }
        }
    }
}

to:

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.

Я уверен, что это что-то действительно простое. Мне нужно изменить розетку или что-то в редакторе раскадровки?? Я могу воспроизвести эту проблему, попытавшись изменить имя GameScene и в новом проекте, поэтому я знаю, что это не что-то конкретное для моего проекта.


person Garry Pettet    schedule 21.07.2016    source источник


Ответы (1)


GameScene на самом деле упоминается еще в одном месте, и ошибка, исходящая от NSKeyedArchiver, должна подсказать вам, где: она закодирована в файле .sks, который вы загружаете. Вы можете найти его на вкладке «Пользовательский класс» файла .sks в редакторе Xcode.

Вкладка

Этот параметр сообщает NSKeyedUnarchiver, какого класса должна быть закодированная сцена, когда вы загружаете файл .sks. Это должна быть последняя оставшаяся ссылка на GameScene, так что это должно завершить ваше переименование!

person andyvn22    schedule 21.07.2016
comment
Это было скрытое место. Спасибо! - person Garry Pettet; 21.07.2016
comment
Вы спасли день! Спасибо! - person Sungwook Kim; 22.10.2019