当我尝试访问 Swift 中的粒子文件时,我的代码出现致命错误

My code has a fatal error when i'm trying to access a particle file in Swift

我正在召唤我在 .sks 文件中创建的粒子。大多数时候,粒子被很好地召唤,但有时(比如 400 分之一)我有一个致命错误。

这是召唤粒子的代码:

    func createParticle(touchLocation : CGPoint) {
      let particles = SKEmitterNode(fileNamed: "MyParticle.sks")!
      let touch = CGPoint(x: touchLocation.x, y: self.view!.frame.height - touchLocation.y)
      particles.position = touch
      particles.zPosition = 1
      addChild(particles)
      particles.run(SKAction.sequence([SKAction.wait(forDuration: 3.0), SKAction.removeFromParent()]))

}

当出现致命错误时,它就在这一行:

    let particles = SKEmitterNode(fileNamed: "MyParticle.sks")!

它说“致命错误:在展开可选值时意外发现 nil”。可能是因为他没有找到该文件,但真正的问题是 为什么 他没有找到该文件,而大多数时候他都找到了...注意:此脚本已执行检测到触摸后。

我试过这个:

func createParticle(touchLocation : CGPoint) {
    for _ in 0...100 {
        let particles = SKEmitterNode(fileNamed: "MyParticle.sks")!
        let touch = CGPoint(x: touchLocation.x, y: self.view!.frame.height - touchLocation.y)
        particles.position = touch
        particles.zPosition = 1
        addChild(particles)
        particles.run(SKAction.sequence([SKAction.wait(forDuration: 3.0), SKAction.removeFromParent()]))
    }
}

我将整个脚本执行了大约 100 次以测试是否会出现致命错误,但并没有发生...

我正在尝试回答这部分问题:

the real question is WHY did'nt he found the file

我的回答假设问题每次都会发生,但只发生在某些版本上。

如果“.sks”文件在 "Copy Bundle Resources" 构建阶段为 0 字节,则可能是这个原因。

您可以检查模拟器中是否存在失败构建的文件。做 cd ~/Library/Developer/CoreSimulator/Devices 然后 find . -name MyParticle.sks。然后对输出的文件名做ls -l。 MyParticle.sks 是您期望的尺寸吗?到底有没有?

FileIO 访问总是很慢。当循环非常快时,您将 运行 进入一种情况,您可能正在读取尚未关闭的文件,因此返回 nil。

相反,调用您的方法一次,并将其存储在变量中。

然后您可以复制您的节点,允许您制作 100 个您需要的副本。

var particleNode = SKEmitterNode(fileNamed: "MyParticle")!  

func createParticle(touchLocation : CGPoint) {
    let particles = particleNode.copy() as! SKEmitterNode
    let touch = CGPoint(x: touchLocation.x, y: self.view!.frame.height - touchLocation.y)
    particles.position = touch
    particles.zPosition = 1
    addChild(particles)
    particles.run(SKAction.sequence([SKAction.wait(forDuration: 3.0), SKAction.removeFromParent()]))
}