2017-03-17 2 views
1

私はdownvotesで十字架にされる前に私はこれについての研究をしたと私はまだこのエラーを取得している理由を理解できないと言うことができます。オプションのアンラップSKPhysicsエラー

私は、プレイヤーが防御しようとしているコアを持っています。流星の流星を守るために、そこから小さなレーザーを撃つことができます。まあ、私はすべての設定と作業(ほとんどの時間とにかく)が、一度とレーザーが流星に当たると、衝突の処理機能は、ショットノードと流星ノードを削除しようとする間、それはこのエラーをスロー:

fatal error: unexpectedly found nil while unwrapping an Optional value 

私はこれに多くの掘り下げを行いましたが、わかりません。ここで

は私のdidBeginです:

func didBegin(_ contact: SKPhysicsContact) { 
    if (contact.bodyA.node?.name == "shot") { // shot A 
     collisionBetween(first: (contact.bodyA.node)!, second: (contact.bodyB.node)!) 
    } else if (contact.bodyB.node?.name == "shot") { // shot B 
     collisionBetween(first: (contact.bodyB.node)!, second: (contact.bodyA.node)!) 
    } 
    if (contact.bodyA.node?.name == "core") { // core A 
     collisionBetween(first: (contact.bodyA.node)!, second: (contact.bodyB.node)!) 
    } else if (contact.bodyB.node?.name == "core") { // core B 
     collisionBetween(first: (contact.bodyB.node)!, second: (contact.bodyB.node)!) 
    } 

} 

、ここで私のcollisionBetween機能です:

func collisionBetween(first: SKNode, second: SKNode) { 

    if first.name == "shot" && second.name == "sMeteor" { 
     first.removeFromParent() // these two only throw the error 
     second.removeFromParent() // every once and a while 
    } else if first.name == "sMeteor" && second.name == "shot" { 
     first.removeFromParent() // these two throw the error also 
     second.removeFromParent() // but only on occasion 
    } else if first.name == "mMeteor" && second.name == "shot" { 
     second.removeFromParent() 
    } else if first.name == "shot" && second.name == "mMeteor" { 
     first.removeFromParent() 
    } 
    if first.name == "core" && second.name == "sMeteor" { 
     second.removeFromParent() //always throws the error 
    } else if first.name == "sMeteor" && second.name == "core" { 
     first.removeFromParent() //always throws the error 
    } 

} 

私は今、しばらくの間、このエラーを把握しようとしてきた、と私は持っているような気がオプションの基本的な理解。これらのエラーは、親からノードを削除しようとするとスローされます。selfこの問題を解決するためにさまざまなアプローチを試しましたが、私の人生にとってはそれを理解できません。どんな助けもありがとう!

答えて

2

これは、SpriteKitが同じ連絡先に対して複数の連絡先イベントを生成することが原因であると強く疑います。 (つまりdidBegin())同じボディで2回以上&ボディB)

初めて呼び出されたときはすべて正常です。 2回目は削除され、いくつかのノードやボディはゼロになります。 Sprite-Kit registering multiple collisions for single contact

をあなたのdidBegin()例えば、いくつかのprint文を入れたい場合は、次のことができます場合は、この答えは見るために

チェックあなたはおそらくログで見てきたと思います

func didBegin(_ contact: SKPhysicsContact) { 
    print("Contact between \(contact.bodyA.node?.name) & \(contact.bodyB.node?.name)") 
    if (contact.bodyA.node?.name == "shot") { // shot A 

:のみ1の接触が発生した

Contact between shot and sMeteor 
Contact between shot and sMeteor 
Contact between shot and sMeteor 

また、didBegin()collisionBetween()の機能はあまりにも複雑に見えます(プラスcollisionBetweenを実際にcontactBetween()と呼びます)。

私はdidBegin()をコーディングするための滑らかな印象の方法がある見つける:

func didBegin(contact: SKPhysicsContact) { 
      let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask 

      switch contactMask { 

      case categoryBitMask.shot | categoryBitMask.sMeteor: 
       print("Collision between shot and sMeteor") 
       contact.bodyA.removeFromParent() 
       contact.bodyB.removeFromParent() 

      case categoryBitMask.shot | categoryBitMask.mMeteor: 
       print("Collision between shot and mMeteor") 
       let shot = contact.bodyA.categoryBitMask == categoryBitMask.shot ? contact.bodyA.node! : contact.bodyB.node! 
       shot.removeFromParent() 

      case categoryBitMask.core | categoryBitMask.sMeteor: 
       print("Collision between core and sMeteor") 
       let meteor = contact.bodyA.categoryBitMask == categoryBitMask.sMeteor ? contact.bodyA.node! : contact.bodyB.node! 
       meteor.removeFromParent() 

      default : 
       //Some other contact has occurred 
       print("Some other contact") 
     } 
    } 

あなたのノードのみを判断するのはあなた次第である、一度に一つのカテゴリに属している場合、これは本当に唯一の安全です。

「コア」と「mMeteor」が接触するとどうなりますか?

+1

私はそれほど疑わしい!これをデバッグしようとするとdidBeginへの複数の呼び出しが発生しましたが、解決方法はわかりませんでした。どうもありがとう、私はあなたがリンクした答えを確かにチェックします。また、私のcollisionBetween関数をクリーンアップしてくれてありがとう、それはむしろ混乱していました。本当にありがとう! –

関連する問題