collisionBitMask 不起作用
collisionBitMask doesn't work
我写了下面的代码来检测玩家、墙和 npc 之间的碰撞:
struct PhysicsCategories{
static let player: UInt32 = 0x1 << 1
static let npc: UInt32 = 0x1 << 2
static let wall: UInt32 = 0x1 << 3
static let all: UInt32 = 0xFFFFFFFF
}
这些是播放器的设置:
self.physicsBody!.categoryBitMask = Constants.PhysicsCategories.player
self.physicsBody!.collisionBitMask = Constants.PhysicsCategories.npc | Constants.PhysicsCategories.wall
self.physicsBody!.contactTestBitMask = Constants.PhysicsCategories.npc
这些是墙的设置:
tileNode.physicsBody!.categoryBitMask = Constants.PhysicsCategories.wall
tileNode.physicsBody!.collisionBitMask = Constants.PhysicsCategories.player | Constants.PhysicsCategories.npc
这些是 npc 的设置:
npc.physicsBody!.categoryBitMask = Constants.PhysicsCategories.npc
npc.physicsBody!.collisionBitMask = Constants.PhysicsCategories.wall | Constants.PhysicsCategories.player | Constants.PhysicsCategories.npc
npc.physicsBody!.contactTestBitMask = Constants.PhysicsCategories.player
我想让npc和墙和玩家发生碰撞。玩家应该与 npc 和墙壁发生碰撞。
结果是玩家可以撞到墙和npc,但是npc只能撞到玩家穿墙..
有没有人知道我在这里做错了什么? npc 在场景中随机走动,collisionbitmask 行为是否受此影响?
编辑:如果我将 npc 的动态 属性 设置为 true,它会起作用。但我不希望 npc 是动态的,因为我不希望玩家可以将 npc 推开。
为什么只有当npc是动态的时候才有效?
如果我没理解错的话,你希望玩家和 NPC "bounce off the walls",而不是相互反弹。解决方案是不将它们的 collisionBitMasks 设置为彼此的 categoryBitMasks,而只设置它们的 contactTestBitMasks。
至于为什么 NPC 需要动态才能从墙上弹开:一个参与者必须是动态的才能使碰撞显示效果:弹开的那个。
如果你不想让玩家能把npc推来推去,就不要乱动dynamic
属性,关掉npc和玩家之间的碰撞就可以了:
npc.physicsBody!.collisionBitMask &= ~Constants.PhysicsCategories.player
这将在 npc collisionBitMask
中将代表玩家类别的位设置为 0,而不影响 npc 的任何其他碰撞设置。
或者一开始就不要设置它们。变化:
npc.physicsBody!.collisionBitMask = Constants.PhysicsCategories.wall | Constants.PhysicsCategories.player | Constants.PhysicsCategories.npc
至
npc.physicsBody!.collisionBitMask = Constants.PhysicsCategories.wall | Constants.PhysicsCategories.npc
因此 npc 不再与玩家发生碰撞 - 这意味着如果 2 发生接触,npc 将不受玩家影响并继续移动,完全不受碰撞影响。但是 contactTestbitMask
仍然设置,因此您的代码将收到碰撞通知。
然而,除非您也为玩家做同样的事情,否则玩家会从 npc 弹开:
player.physicsBody!.collisionBitMask &= ~Constants.PhysicsCategories.npc
当你说:
The npc is walking randomly around the scene, is the collisionbitmask
behavior affected by this?
你的意思是它只是从东西上弹开并在屏幕上弹跳,还是你的移动代码有问题?如果是前者,就照 Kod 说的做,将 restitution 设置为 0。来自 https://developer.apple.com/documentation/spritekit/skphysicsbody :
The restitution property determines how much energy a body maintains
during a collision—its bounciness.
我写了下面的代码来检测玩家、墙和 npc 之间的碰撞:
struct PhysicsCategories{
static let player: UInt32 = 0x1 << 1
static let npc: UInt32 = 0x1 << 2
static let wall: UInt32 = 0x1 << 3
static let all: UInt32 = 0xFFFFFFFF
}
这些是播放器的设置:
self.physicsBody!.categoryBitMask = Constants.PhysicsCategories.player
self.physicsBody!.collisionBitMask = Constants.PhysicsCategories.npc | Constants.PhysicsCategories.wall
self.physicsBody!.contactTestBitMask = Constants.PhysicsCategories.npc
这些是墙的设置:
tileNode.physicsBody!.categoryBitMask = Constants.PhysicsCategories.wall
tileNode.physicsBody!.collisionBitMask = Constants.PhysicsCategories.player | Constants.PhysicsCategories.npc
这些是 npc 的设置:
npc.physicsBody!.categoryBitMask = Constants.PhysicsCategories.npc
npc.physicsBody!.collisionBitMask = Constants.PhysicsCategories.wall | Constants.PhysicsCategories.player | Constants.PhysicsCategories.npc
npc.physicsBody!.contactTestBitMask = Constants.PhysicsCategories.player
我想让npc和墙和玩家发生碰撞。玩家应该与 npc 和墙壁发生碰撞。 结果是玩家可以撞到墙和npc,但是npc只能撞到玩家穿墙..
有没有人知道我在这里做错了什么? npc 在场景中随机走动,collisionbitmask 行为是否受此影响?
编辑:如果我将 npc 的动态 属性 设置为 true,它会起作用。但我不希望 npc 是动态的,因为我不希望玩家可以将 npc 推开。 为什么只有当npc是动态的时候才有效?
如果我没理解错的话,你希望玩家和 NPC "bounce off the walls",而不是相互反弹。解决方案是不将它们的 collisionBitMasks 设置为彼此的 categoryBitMasks,而只设置它们的 contactTestBitMasks。
至于为什么 NPC 需要动态才能从墙上弹开:一个参与者必须是动态的才能使碰撞显示效果:弹开的那个。
如果你不想让玩家能把npc推来推去,就不要乱动dynamic
属性,关掉npc和玩家之间的碰撞就可以了:
npc.physicsBody!.collisionBitMask &= ~Constants.PhysicsCategories.player
这将在 npc collisionBitMask
中将代表玩家类别的位设置为 0,而不影响 npc 的任何其他碰撞设置。
或者一开始就不要设置它们。变化:
npc.physicsBody!.collisionBitMask = Constants.PhysicsCategories.wall | Constants.PhysicsCategories.player | Constants.PhysicsCategories.npc
至
npc.physicsBody!.collisionBitMask = Constants.PhysicsCategories.wall | Constants.PhysicsCategories.npc
因此 npc 不再与玩家发生碰撞 - 这意味着如果 2 发生接触,npc 将不受玩家影响并继续移动,完全不受碰撞影响。但是 contactTestbitMask
仍然设置,因此您的代码将收到碰撞通知。
然而,除非您也为玩家做同样的事情,否则玩家会从 npc 弹开:
player.physicsBody!.collisionBitMask &= ~Constants.PhysicsCategories.npc
当你说:
The npc is walking randomly around the scene, is the collisionbitmask behavior affected by this?
你的意思是它只是从东西上弹开并在屏幕上弹跳,还是你的移动代码有问题?如果是前者,就照 Kod 说的做,将 restitution 设置为 0。来自 https://developer.apple.com/documentation/spritekit/skphysicsbody :
The restitution property determines how much energy a body maintains during a collision—its bounciness.