Hit fatal error: unexpectedly found nil while unwrapping an Optional value (lldb)

Hit fatal error: unexpectedly found nil while unwrapping an Optional value (lldb)

我编写了一个简单的游戏,在第一次碰撞时出现以下错误:

Hit fatal error: unexpectedly found nil while unwrapping an Optional value (lldb)

这是我的代码:

func didBeginContact(contact: SKPhysicsContact) {

    var firstBody: SKPhysicsBody
    var secondBody: SKPhysicsBody

    if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask {
        firstBody = contact.bodyA
        secondBody = contact.bodyB

    } else {
        firstBody = contact.bodyB
        secondBody = contact.bodyA
    }

    if ((firstBody.categoryBitMask & PhysicsCategory.Monster != 0) &&
        (secondBody.categoryBitMask & PhysicsCategory.naboj != 0)) {
            projectileDidCollideWithMonster(firstBody.node as SKSpriteNode, monster: secondBody.node as SKSpriteNode)

    }

}

我之前也遇到过同样的问题,我就是这样做的

基本上,当您展开物理 body 时(这通常发生在 secondBody.node! 行),会发生以下情况:

  1. 如果您有 3 个物体(abc)发生碰撞,并且碰撞逻辑适用于所有 3 个物体,sprite kit 将执行 2碰撞检查:

    • 一个身体 ab
    • 然后是身体 bc
  2. 您正在移除碰撞时的物体:

    • 第一次检测: 物体 ab 被展开,物体 ab被移除

    • 秒检测:只剩下bodyc因为ab被移除了.这意味着 secondBodyfirstBody 现在为零。所以抛出错误

尝试将您的代码更改为以下内容,它应该可以解决问题:

var firstBody: SKPhysicsBody?
var secondBody: SKPhysicsBody?

if (firstBody!.node! != nil && secondBody!.node! != nil) {
       if ((firstBody.categoryBitMask & PhysicsCategory.Monster != 0) &&
                (secondBody.categoryBitMask & PhysicsCategory.Projectile != 0)) {
                projectileDidCollideWithMonster(secondBody.node!, monster: firstBody.node!)
        }
}

您使用的是 swift 1 还是 1.2?

尝试

if ((firstBody.categoryBitMask & PhysicsCategory.Monster != 0) &&
    (secondBody.categoryBitMask & PhysicsCategory.naboj != 0)) {

    if let firstNode = firstBody.node as? SKSprintNode,
       let secondNode = secondBody.node as? SKSprinteNode {

       projectileDidCollideWithMonster(firstNode, monster: secondNode)
    }
}

试试这个方法:

if ((firstBody.categoryBitMask & PhysicsCategory.Monster != 0) &&
    (secondBody.categoryBitMask & PhysicsCategory.naboj != 0)) {
    if(firstBody.node != nil && secondBody.node != nil ) {
        projectileDidCollideWithMonster(firstBody.node as SKSpriteNode, monster: secondBody.node as SKSpriteNode) }
}

好的,这花了我一段时间才弄明白,但我最终还是明白了。我尝试了大多数我能在网上找到的其他解决方案,但运气不佳。我不得不通过艰难的方式来解决这个问题。如果找到 nil,您需要做的是提供 break/ return 选项。因为大多数情况下,当同时触发两个相同的碰撞时会发生此错误。

我所做的是在出现 nil 时对 return 函数进行 if else 语句。

func didBeginContact(contact: SKPhysicsContact) {

var firstBody: SKPhysicsBody
var secondBody: SKPhysicsBody

if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask {
    firstBody = contact.bodyA
    secondBody = contact.bodyB

} else {
    firstBody = contact.bodyB
    secondBody = contact.bodyA
}

if ((firstBody.categoryBitMask & PhysicsCategory.Monster != 0) &&
    (secondBody.categoryBitMask & PhysicsCategory.naboj != 0)) {
// new part
    if (firstBody.node == nil || secondBody.node == nil)
    {return}

else {
 projectileDidCollideWithMonster(firstBody.node as SKSpriteNode, monster: secondBody.node as SKSpriteNode)
}}}

希望对您有所帮助。 同样重要的是,通过在 if 而不是 else 中使用 return 语句,像对待 nil 一样对待它。