如何让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代码截图:
问题根源
- 直接修改
global_transform.origin.y会绕过CharacterBody3D的物理系统,物理引擎同时处理重力下落和手动改位置,两者拉扯导致坠落+瞬移的冲突 - 注释重力后,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
相关产品推荐
相关产品推荐

