如何重命名 iOS SpriteKit 模板中的默认场景?
How do you rename the default scene in the iOS SpriteKit template?
我对 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
。
我相信这真的很简单。我需要在情节提要编辑器中更改出口或其他内容吗?我也可以通过尝试在新项目中更改 GameScene
的名称来重现此问题,因此我知道这不是我的项目所特有的。
GameScene
实际上在一个地方被引用,来自 NSKeyedArchiver
的错误应该提示您在哪里:它在您正在加载的 .sks
文件中编码.您可以在 Xcode 编辑器的 .sks
文件的 "Custom Class" 选项卡中找到它。
此设置告诉 NSKeyedUnarchiver
当您加载 .sks
文件时,class 编码的场景应该是什么。这应该是对 GameScene
的最后剩余引用,所以这应该完成您的重命名!
我对 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
。
我相信这真的很简单。我需要在情节提要编辑器中更改出口或其他内容吗?我也可以通过尝试在新项目中更改 GameScene
的名称来重现此问题,因此我知道这不是我的项目所特有的。
GameScene
实际上在一个地方被引用,来自 NSKeyedArchiver
的错误应该提示您在哪里:它在您正在加载的 .sks
文件中编码.您可以在 Xcode 编辑器的 .sks
文件的 "Custom Class" 选项卡中找到它。
此设置告诉 NSKeyedUnarchiver
当您加载 .sks
文件时,class 编码的场景应该是什么。这应该是对 GameScene
的最后剩余引用,所以这应该完成您的重命名!