Godot 4.3:如何让CharacterBody3D碰撞墙体后反向反弹
解决Godot 3D子弹碰撞反弹问题
你的代码核心问题是绕过了Godot的物理移动逻辑,导致碰撞检测和响应失效,具体问题和修复方案如下:
问题根源
直接修改
position导致穿墙
你通过position += ...直接修改子弹位置,这会跳过Godot物理系统的碰撞检测流程——物理引擎无法在你强制移动位置的过程中拦截碰撞,等move_and_collide检测到碰撞时,子弹已经穿过墙体了。velocity未正确初始化和使用
你的velocity变量初始为空(默认Vector3.ZERO),move_and_collide(velocity * delta)等于没有执行有效移动,碰撞检测完全滞后于你的手动位置修改,自然无法触发正确的反弹。
修复后的代码
extends CharacterBody3D const SPEED = 20.0 func _ready(): # 初始化子弹的初始移动速度,基于自身朝向 velocity = transform.basis * Vector3(0, 0, -SPEED) func _physics_process(delta): # 完全依赖move_and_collide处理移动+碰撞检测 var collision = move_and_collide(velocity * delta) if collision: # 根据碰撞法线计算反弹后的速度 velocity = velocity.bounce(collision.get_normal()) # 可选:如果需要严格保持反弹后的速度大小,取消下面注释 # velocity = velocity.bounce(collision.get_normal()).normalized() * SPEED
额外注意事项
- 确保子弹和墙体都添加了
CollisionShape3D组件,并且碰撞层/掩码设置正确(双方的碰撞层能互相检测)。 - 如果反弹后出现速度衰减或方向异常,可以检查碰撞法线是否正确(比如墙体的碰撞形状是否正确贴合模型)。
内容的提问来源于stack exchange,提问作者Angel Andrade
相关产品推荐
相关产品推荐

