SKPhysicsBody 的奇怪行为

Strange behaviour of SKPhysicsBody

在我的应用程序中,我想以编程方式为节点创建物理体。然而,当我以编程方式创建物理体时,它似乎不起作用,尽管在 SpriteKit 编辑器中创建的物理体确实有效。当物理体以编程方式创建时,它不会与另一个节点发生碰撞,而当它在编辑器中创建时,它会发生碰撞。

这是我的代码:

physicsBody = SKPhysicsBody(rectangleOf: size)

    if let body = self.physicsBody{
        body.isDynamic = true
        body.affectedByGravity = false
        body.allowsRotation = false
        body.categoryBitMask = CollisionCategoryBitmask.shootWall.rawValue
        body.collisionBitMask = CollisionCategoryBitmask.circle.rawValue
        body.contactTestBitMask = CollisionCategoryBitmask.circle.rawValue
    }

size 是节点的大小属性。

当我现在注释掉物理体分配给节点的第一行并改为在 SpriteKit 场景编辑器中设置物理体时,它确实起作用了。请注意,在这两种情况下,if 条件中的代码都会被执行。

更新:

有趣的是,当我这样做时:

physicsBody = SKPhysicsBody(bodies: [physicsBody!])

这应该不会有任何影响,因为它基本上什么都没改变,所以它也不起作用。这是 SpriteKit 中的错误吗?

当你这样做时

required init?(coder aDecoder: NSCoder) {
    factor = 0.5
    super.init(coder: aDecoder)
    self.pBody() 

}

physicsWorld 尚不存在,因此 body 未放置在世界中。

您想在创建后执行此操作,因此请将您的代码放入闭包中,以便在设置完成后启动。您可以使用 DispatchQueue

required init?(coder aDecoder: NSCoder) {
    factor = 0.5
    super.init(coder: aDecoder)
    DispatchQueue.main.async {
        self.pBody() //This will fire after the SKS finished building the scene, so physicsWorld will exist
    }
}