2017-10-26 29 views
0

노드가 접촉 본문 (SKPhysicsBody)에 연결되도록하는 중입니다.이 노드는 SKSpriteNode와의 접촉을 감지하는 동안 호출됩니다. 때로는 노드가 접촉 본문에 연결될 수 없기 때문에 오류가 발생하므로 해당 유형의 오류를 피하기 위해 노드가 있는지 테스트합니다. 그러나 경고는 거짓이 결코 돌아 오지 않을 것이라고 알려줍니다. 테스트 한 이후로 더 이상 오류가 발생하지 않았지만 제대로 작동하는지 또는 여전히 발생할 수 있는지 확실하지 않습니다. 너는 어떤 생각을 가지고 있니? 귀하의 조언에 대한노드가 physicsBody 스위프트에 연결되어 있는지 테스트

//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/receiving-an-node-make-contact) – 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 
      } 
     } 
    } 
}