You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Godot 4.3:如何让CharacterBody3D碰撞墙体后反向反弹

解决Godot 3D子弹碰撞反弹问题

你的代码核心问题是绕过了Godot的物理移动逻辑,导致碰撞检测和响应失效,具体问题和修复方案如下:

问题根源

  1. 直接修改position导致穿墙
    你通过position += ...直接修改子弹位置,这会跳过Godot物理系统的碰撞检测流程——物理引擎无法在你强制移动位置的过程中拦截碰撞,等move_and_collide检测到碰撞时,子弹已经穿过墙体了。

  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 17:25:02