2017-10-26 40 views
0

コンタクトボディ(SKPhysicsBody)にノードが接続され、SKSpriteNodeとの接触が検出されたときに呼び出されます。場合によっては、ノードを接点本体に接続できないためにエラーが発生することがあるので、そのタイプのエラーを回避するノードがあるかどうかをテストします。しかし、警告はそれが偽に戻ってくることはないと私に伝えます。私はそれをテストして以来、このようなエラーはもうありませんでしたが、それがうまくいくかどうか、あるいはそれがまだ起こるかどうかはわかりません。あなたは何か考えていますか?ノードがphysicsBody swiftにアタッチされているかどうかのテスト

//The actual code 
func didBegin(_ contact: SKPhysicsContact) { 
    if (contact.bodyA.categoryBitMask == enemyCategory) && (contact.bodyB.categoryBitMask == shootCategory){ //test if it is the contact with I want to catch 
     let shootNode = contact.bodyB.node, shootNode != nil { // I test if there's a node attached to the enemyShootNode but it's supposed never to return false 
      let enemyNode = contact.bodyA.node, enemyNode != nil { // I test if there's a node attached to the shootNode but it's supposed never to return false 
       let enemySKNode = enemyNode as? SKSpriteNode 
       let shootSKNode = shootNode as? SKSpriteNode 
       // code 
      } 
     } 
    } 
} 

    // The code with error 
func didBegin(_ contact: SKPhysicsContact) { 
    if (contact.bodyA.categoryBitMask == enemyCategory) && (contact.bodyB.categoryBitMask == shootCategory){ 
     let shootNode = contact.bodyB.node! 
     let enemyNode = contact.bodyA.node! // The error occurs here : "fatal error: unexpectedly found nil while unwrapping an Optional value" 
     let enemySKNode = enemyNode as? SKSpriteNode 
     let shootSKNode = shootNode as? SKSpriteNode 
    } 
} 
+0

私はSOに、より良い検索し、学ぶために時間を割いてお勧めします他の窮地を抱えていた、あなたはそのように多くを学ぶでしょう。 https://stackoverflow.com/questions/36655903/unexpectedly-found-nil-skspritenode、https://stackoverflow.com/questions/31057866/when-projectile-hits-two-monsters-the-didbegincontact-method-crashes- i-know-w、https://stackoverflow.com/questions/30030784/hit-fatal-error-unexpectedly-found-nil-while-unwrapping-an-optional-value-lldb、https://stackoverflow.com/質問/ 34188183/why-my-node-calls-didbegin連絡方法 - その場にいないとき – Knight0fDragon

+0

[ノードが連絡したときにエラーを受け取る](https://stackoverflow.com/questions)の可能な複製/ 44895717 /受信中ノード間連絡時エラー) – Knight0fDragon

+0

この質問にも解決策を読むことをお勧めします。通常、これはオプションの '?'変数に 'nil'の値を代入することと関係しています。あなたの変数をチェックしたり、コードにブレークポイントを追加して' nil'値がどこから来るかを調べます。 https://stackoverflow.com/questions/32170456/what-does-fatal-error-unexpectedly-found-nil-while-unwrapping-an-optional-valu?rq=1 – KSigWyatt

答えて

0

あなたのアドバイスのおかげで、エラーが実際にSKPhysicsプロパティから来る(didBegin関数が複数回呼ばれている)が、私は修正するために管理していませんでした。 スプライトがここにいた場合、私は私がチェックしていた方法を修正し、私はそれがうまく機能したとしてこれ以上の警告やエラーはありませんが:

func didBegin(_ contact: SKPhysicsContact) { 
    if (contact.bodyA.categoryBitMask == enemyCategory) && (contact.bodyB.categoryBitMask == shootCategory) || (contact.bodyA.categoryBitMask == shootCategory) && (contact.bodyB.categoryBitMask == enemyCategory){ 
     if var shootNode = contact.bodyB.node{ 
      if var enemyNode = contact.bodyA.node{ 
       // If the enemyNode and the shootNode don't respectively correspond to 
       if contact.bodyA.categoryBitMask == shootCategory { 
        shootNode = contact.bodyA.node! 
        enemyNode = contact.bodyB.node! 
       } 
       let enemySKNode = enemyNode as? SKSpriteNode 
       let shootSKNode = shootNode as? SKSpriteNode 
      } 
     } 
    } 
} 
関連する問題