最佳答案
关键是要确保您的类别都是 2 的幂(2、4、8、16 等),这样您就可以充分利用位掩码。
要检查两个对象是否发生碰撞,SceneKit 将执行类似于下面所示的 willCollide
函数的操作。按位 AND (&
) 运算符用于检查 Int 中的任何位是否在 category
和 collidesWith
中匹配。如果任何位匹配,则对象应该发生碰撞。
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
您可以使用按位 OR (|
) 运算符来组合多个 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
- 碰撞 mask = 12
4 | 8 = 0010 | 0100 = 0110 = 12
- 敌人
- 类别 = 4
- 碰撞 mask = 2
- 地面
- 类别 = 8
- 碰撞 mask = 2
为敌人和地面设置碰撞 mask 很重要,因为有时敌人会与玩家发生碰撞。这与玩家与敌人碰撞不同。注意:我省略了敌人也会接触地面的部分,反之亦然。
关于ios - 如何在 SceneKit 场景编辑器中设置多重碰撞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33199502/