2017-12-29 16 views
0

Ich habe einige Probleme mit der Erkennung von Kollisionen. Ich möchte in der Konsole sehen, dass eine Kollision erkannt wird.Erkennen von Kollisionen in SceneKit Problem

Wenn Knoten generiert werden, sehe ich in der Konsole, welche Art von KategorieBitMask sie haben, also gibt es kein Problem. CollisionMask und contactBitMask werden ebenfalls festgelegt.

So interagieren Objekte miteinander ohne Probleme.

Wenn ich Masken ändere, hören sie auf miteinander zu interagieren, so dass sie sich gegenseitig durchlaufen. Also kann ich sagen, dass die Maske richtig eingestellt ist. Masken ich mit dem Helfer-Struktur festgelegt:

struct BitMaskCategory: OptionSet { 
    let rawValue: Int 

    static let none = BitMaskCategory(rawValue: 0 << 0) // 0 
    static let box  = BitMaskCategory(rawValue: 1 << 0) // 1 
    static let plane = BitMaskCategory(rawValue: 1 << 1) // 2 
} 

Ein Körper ist .Dynamisches physicsBody andere ist .static.

Meine Viewcontroller Klasse SCNPhysicsContactDelegate Protokoll implementieren und in viewDidLoad ich schreibe:

sceneView.scene.physicsWorld.contactDelegate = self 

Danach versuche ich Methode zu verwenden, aber es nicht einmal genannt:

func physicsWorld(_ world: SCNPhysicsWorld, didBegin contact: SCNPhysicsContact) { 
    if contact.nodeB.physicsBody?.contactTestBitMask == 1 { 
     print("NodeB has mask = 1") 
    } else { 
     print("NodeB has mask != 1") 
    } 
} 

Nach dass ich auf den Bildschirm drücke und sehe, dass Würfel kommen und die ebene Oberfläche treffen, aber es gibt überhaupt keine Kontakterkennung. Delegiertenmethode physicsWorld (_ Welt: SCNPhysicsWorld, didBegin Kontakt: SCNPhysicsContact) wird gar nicht aufgerufen.

Was ich vermisse?

Vielen Dank!

Antwort

0

Nach mehreren Stunden Debug-Challenge habe ich festgestellt, dass ich Szene neu schreiben, nachdem ich Delegat gesetzt habe.

War

sceneView.scene.physicsWorld.contactDelegate = self 
    let scene = SCNScene() 
    sceneView.scene = scene 

werden sollten:

let scene = SCNScene() 
    sceneView.scene = scene 

    sceneView.scene.physicsWorld.contactDelegate = self 

Für meinen Fall das Problem damit behoben. Hoffe jemand wird Stunden damit sparen :)