我只是想知道如何检测KinematicBody在代码中与哪个层发生冲突。
我有4层:
播放器
屋顶
地面
墙壁
如何使用代码检查玩家是否与地面层发生碰撞?我使用move_and_slide((来移动我的玩家,所以他们最好的解决方案是我可以使用move_and _slade((的碰撞检测。
您可以使用get_slide_count
和get_slide_collision
获得KinematicBody
在move_and_slide
或move_and_slide_with_snap
运动过程中碰撞的内容。
类似这样的东西:
for index in get_slide_count():
var collision := get_slide_collision(index)
var collider:PhysicsBody = collision.collider
if not is_instance_valid(collider):
continue
# …
现在,既然你说";层";,我想我们谈论的是collision_layer
,所以也许你可以做这样的事情:
for index in get_slide_count():
var collision := get_slide_collision(index)
var collider:PhysicsBody = collision.collider
if not is_instance_valid(collider):
continue
if collider.get_collision_layer_bit(3):
# …
将3
替换为要检查的层的位数
当然,您可以使用其他过滤方式。如节点组:
if collider.is_in_group("Ground"):
# …
类(需要使用class_name Ground
设置脚本(:
if collider is Ground:
# …
名称:
if collider.name == "Ground":
# …
等等。
顺便说一句,如果你正在与is_on_floor
作斗争,首先,在move_and_slide
或move_and_slide_with_snap
之后检查它。如果你得到的是间歇性的结果,试着把物理引擎改为";GodotPhysics;关于物理学下的项目设置->3D。
使CCD_ 12与";项目符号"就是要确保地板上总是有一个速度。这提醒了我,您从get_slide_collision
获得的碰撞中还有其他信息,包括normal
。