如何在 SceneKit 场景编辑器中设置多重碰撞

How to set up multiple collision in SceneKit Scene Editor

我正在使用 XCode 7 中的新 SceneKit 编辑器。我设法与两个对象发生碰撞。我想知道如何指定与多个类别的碰撞。假设玩家与地面和敌人发生碰撞。我怎样才能只用这两个输入字段实现这一点?

关键是要确保您的类别都是 2 的幂(2、4、8、16 等),这样您才能充分利用位掩码。

要检查两个对象是否发生碰撞,SceneKit 将执行类似于下面显示的 willCollide 函数的操作。按位与 (&) 运算符用于检查 Ints 中的任何位是否在 categorycollidesWith 中匹配。如果任何位匹配,则对象应该发生碰撞。

func willCollide(category:Int, collidesWith:Int) -> Bool {
    return category & collidesWith != 0
}

使用 2 的幂意味着每个类别在 Int 中都有唯一的位位置。

let cat1:Int = 2    // 00010
let cat2:Int = 4    // 00100
let cat3:Int = 8    // 01000
let cat4:Int = 16   // 10000

willCollide(cat1, collidesWith: cat1)  // true
willCollide(cat1, collidesWith: cat2)  // false

您可以使用按位或 (|) 运算符组合多个 Int,在这种情况下允许一个类别联系多个其他类别。

let cat1and2 = cat1 | cat2  //  00110 or 6 in decimal
willCollide(cat1, collidesWith: cat1and2)  // true
willCollide(cat2, collidesWith: cat1and2)  // true
willCollide(cat3, collidesWith: cat1and2)  // false

对于您的示例,类似以下内容会起作用;

  • 播放器
    • 类别 = 2
    • 碰撞掩码 = 12
      • 4 | 8 = 0010 | 0100 = 0110 = 12
  • 敌人
    • 类别 = 4
    • 碰撞掩码 = 2
  • 地面
    • 类别 = 8
    • 碰撞掩码 = 2

为敌人和地面设置碰撞掩码很重要,因为有时敌人会与玩家发生碰撞。这不同于玩家与敌人的碰撞。注意:我省略了敌人也会接触地面的部分,反之亦然。