【问题标题】:SKEmitterNode CrashSKEmitterNode 崩溃
【发布时间】:2014-08-27 19:20:30
【问题描述】:

我正在尝试从 sks 文件加载 SKEmitterNode,但我不断收到此错误:

Terminating app due to uncaught exception
'NSInvalidUnarchiveOperationException', 
reason: '*** -[NSKeyedUnarchiver decodeObjectForKey:]: 
cannot decode object of class (SKEditorScene)'

代码:

var explosion = SKEmitterNode.emitterNodeWithName("Explosion")

retval.addChild(explosion)

扩展方法:

class func emitterNodeWithName(name: String) -> SKEmitterNode
{
    return NSKeyedUnarchiver.unarchiveObjectWithFile(NSBundle.mainBundle().pathForResource(name, ofType: "sks")!) as SKEmitterNode
}

有什么想法吗?

【问题讨论】:

  • 这是由于 XCode 将 .sks 文件视为场景并损坏它的错误。它已在 XCode 6.1 Beta 中修复

标签: swift sprite-kit xcode6


【解决方案1】:

我有同样的问题,似乎是当前测试版中的一个错误。 这是一种解决方法:

func particleEmitterWithName(name : NSString) -> SKEmitterNode?
{
    let path = NSBundle.mainBundle().pathForResource(name, ofType: "sks")

    var sceneData = NSData.dataWithContentsOfFile(path!, options: .DataReadingMappedIfSafe, error: nil)
    var archiver = NSKeyedUnarchiver(forReadingWithData: sceneData)

    archiver.setClass(SKEmitterNode.self, forClassName: "SKEditorScene")
    let node = archiver.decodeObjectForKey(NSKeyedArchiveRootObjectKey) as SKEmitterNode?
    archiver.finishDecoding()
    return node
}

【讨论】:

  • 这个答案很棒。如果您尝试将归档对象从 iOS 应用程序传递到其 Apple Watch 扩展对应项,setClass 函数似乎是不可避免的。即使为 iOS 应用程序和扩展程序编译了相同的自定义类,它在两个二进制文件中的名称也不完全相同,我不得不使用这个答案在 Apple Watch 扩展程序中调整它的名称。非常感谢!
【解决方案2】:

我注意到在粒子发射器编辑器中更改某些属性后发生了崩溃。因此,您还可以在 Xcode 5 的代码或编辑器中编辑属性以避免崩溃。显然 Xcode 6 中的编辑器正在破坏文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-02
    • 1970-01-01
    • 2011-11-22
    • 2021-05-14
    • 1970-01-01
    • 2016-11-09
    • 2018-12-11
    • 2013-05-30
    相关资源
    最近更新 更多