检测SceneKit问题中的冲突

时间:2017-12-29 08:47:00

标签: ios swift collision-detection scenekit

我在检测碰撞时遇到了一些问题。我想在控制台中看到检测到碰撞。

当生成节点时,我在控制台中看到它们具有哪种类别的BlockMask,所以一定没有问题。还设置了CollisionMask和contactBitMask。

所以对象互相交互没有问题。

如果我更换面具,他们就会停止互相交流,以便彼此互相通过。所以我可以说面具设置正确。 我使用辅助结构设置的掩码:

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
}

一个团体是 .dynamic physicsBody other是 .static。

我的ViewController类实现 SCNPhysicsContactDelegate 协议,并在 viewDidLoad 中写道:

sceneView.scene.physicsWorld.contactDelegate = self

之后我尝试使用方法,但它甚至没有被调用:

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

之后我按下屏幕,看到立方体即将到来并击中平面,但根本没有接触检测。委托方法 physicsWorld(_ world:SCNPhysicsWorld,didBegin contact:SCNPhysicsContact)甚至根本没有被调用。

我想念的是什么?

谢谢!

1 个答案:

答案 0 :(得分:3)

经过多个小时的调试挑战后,我发现在设置委托后我重写了场景。

当时:

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

应该是:

    let scene = SCNScene()
    sceneView.scene = scene

    sceneView.scene.physicsWorld.contactDelegate = self

对于我的情况,这解决了这个问题。 希望有人可以节省时间:)