我在Xcode的.sks编辑器中设置自定义类时遇到了问题。 (我使用的是Xcode 7.1)
我正在研究一套基于SpriteKit的应用程序,这些应用程序将使用多个场景以及SKScene和各种SKNode的自定义类。
现在,我有一个概念验证工作。我可以创建一个新的.sks文件,进入并在" Custom Class"中输入我的自定义子类的名称。给定场景或节点的检查器的字段,将模块名称留空,它将正确编译。它可以正常工作,按预期将自定义子类连接到项目。工作流程直截了当,可预测。
但后来我做了...... 某事 ......它不再有用了。我不确定是什么促使了这一变化,但我怀疑它与尝试在同一个项目中创建另一个目标有关(因为我想要有两个使用相同引擎的应用程序,只有不同的资产和.sks文件)。
无论如何,现在,当我编译并运行我的应用程序时,当我加载.sks文件时,它加载没有错误,但是自定义子类根本不应用。没有错误,没有崩溃,甚至没有通知控制台它无法找到自定义子类。检查该项目清楚地表明它只是一个香草SKScene或SKSpriteNode,而不是子类。
我认为这与没有正确的模块名称有关,但我不确定如何找到应该是什么。我尝试将项目名称转换为字母和下划线,这似乎适用于一两件事,但不可靠,这很奇怪。此外,必须在每个项目中键入那个长模块名称将是一件苦差事并且容易出错 - 我将输入该模块名称很多。我希望能回到原来的状态,我可以把它留空。
我决定回滚,而不是添加新目标,我只是创建一个不同的项目。我创建了一个新项目,移动了资产,并尝试实例化它们,再次,它没有工作!现在,无论我在模块领域放什么,我都无法识别它们。
我猜猜.sks文件是某种方式"烘焙"当前模块进入文件还是什么?但我似乎无法与他们争吵。
我喜欢能够做的只是为项目创建我的.sks文件,输入我想要它使用的子类的名称 - 无论模块 - 和将所有内容保持在同一个"默认模块"这样我就可以将我的共享代码库用于引擎或我的自定义子类用于该目标。我原来的工作流程很棒,但我似乎无法实现除了一个目标以外的任何目标。
这是不现实的吗?是否有一些最佳实践或其他技术来获取这些.sks文件以可靠地加载我希望它们加载的子类?
编辑:根据要求,这里是我如何加载场景(更改了一些变量名称以增加此示例的清晰度):
if let start = SKScene(fileNamed: "Scene0") {
start.scaleMode = .AspectFill
spriteKitSceneView!.presentScene( start )
if let _ = start as? CustomScene {
print("Scene0 is a CustomScene")
} else {
print("Scene0 is NOT a CustomScene")
}
} else {
print("Could not get Scene0")
}
}
印刷声明是为了澄清会发生什么。这段代码将打印出来"即使我已经输入" CustomScene",Scene0也不是CustomScene"作为.sks编辑器中场景的自定义类。
答案 0 :(得分:1)
当您尝试创建对象时,您使用错误的初始化程序创建它。你想使用if let start = CustomScene(fileNamed: "Scene0")
否则你说开始应该是SKScene,这不是你想要的。