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

如何让Godot的CharacterBody3D保持在地面上方固定高度飞行?

问题:CharacterBody3D通过RayCast3D维持飞行高度异常

我尝试用RayCast3D让敌人(CharacterBody3D)在地面上方固定高度飞行,检测到碰撞后将敌人放置在地面上方2.5单位高度,但代码无法正常运行:

  • 添加global_transform.origin.y=collisionPoint.y+2.5后,敌人会先坠落,随即瞬移回设定高度,移动时出现严重异常
  • 注释重力代码后,敌人不再坠落,但仅能在检测到下方物体时向上移动,完全无法正常移动

现有代码:

func _physics_process(delta: float) -> void:

 if raycastNode.is_colliding():
  var collisionPoint=raycastNode.get_collision_point()
  global_transform.origin.y=collisionPoint.y+2.5 #此代码导致敌人坠落并瞬移回设定高度,严重影响移动

 # 添加重力
 if not is_on_floor():
   velocity.y -= gravity * delta #注释此代码后敌人无法移动,仅在下方有物体时向上移动

场景截图:场景截图
_physics_process代码截图:_physics_process代码截图


问题根源

  1. 直接修改global_transform.origin.y会绕过CharacterBody3D的物理系统,物理引擎同时处理重力下落和手动改位置,两者拉扯导致坠落+瞬移的冲突
  2. 注释重力后,CharacterBody3D缺少移动所需的物理驱动,仅靠高度调整的逻辑无法完成正常移动

修复代码

func _physics_process(delta: float) -> void:
    # 平滑维持飞行高度
    if raycastNode.is_colliding():
        var collision_point = raycastNode.get_collision_point()
        var target_y = collision_point.y + 2.5
        # 计算当前位置与目标高度的差值,用velocity平滑修正
        var y_offset = global_transform.origin.y - target_y
        velocity.y = y_offset * -5.0 # 系数可调整,越大高度修正越快

    # 移除原重力判断,飞行状态不需要依赖is_on_floor
    # 若需要轻微下落感可保留重力,但要调低数值避免和高度控制冲突
    # velocity.y -= gravity * 0.2 * delta

    # 必须保留move_and_slide,否则敌人无法移动
    move_and_slide()

补充说明

  • 确保RayCast3D已启用(enabled=true),且发射方向为向下(默认-Z轴,若场景中方向错误需调整)
  • 若要实现敌人向玩家移动,需添加X/Z轴的速度控制,示例:
    # 假设已获取player节点引用
    var move_dir = (player.global_transform.origin - global_transform.origin).normalized()
    var move_speed = 3.0
    velocity.x = move_dir.x * move_speed
    velocity.z = move_dir.z * move_speed
    
  • 高度修正系数(*-5.0)可根据需求调整,平衡平滑度和响应速度

内容的提问来源于stack exchange,提问作者inferjus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 12:17:22