Godot中如何实例化场景并使其仅朝向X或Z方向,禁止Y轴旋转?
问题根因
- 操作顺序错误:你在将墙添加为
muzzle子节点之前调用了look_at,此时look_at计算的是全局空间朝向,添加到muzzle下后,墙的变换会继承muzzle的局部偏移,之前设置的朝向就会错乱。子弹逻辑无异常是因为子弹生成后通常会在运动逻辑中脱离父节点、使用全局坐标移动,父节点的变换不会对其生效。 - 未限制轴向旋转:默认的
look_at会根据目标点的高度差计算俯仰角,导致墙出现非水平方向的旋转,不符合墙始终垂直地面的需求。
修复代码
if Input.is_action_just_pressed("light_attack"): var b = bullet.instance() muzzle.add_child(b) b.look_at(aimcast.get_collision_point(), Vector3.UP) b.shoot = true print(aimcast.get_collision_point()) if Input.is_action_just_pressed("block"): var w = wall.instance() # 先将墙加入场景树,后续变换计算基于正确的父节点空间 muzzle.add_child(w) # 如果你需要墙正面朝向相机,直接取相机全局位置作为朝向目标 var target_pos = get_viewport().get_camera_3d().global_position # 抹平Y轴坐标差,完全禁止上下方向的俯仰旋转,保证墙始终垂直地面 target_pos.y = w.global_position.y # 使用全局look_at保证朝向正确 w.global_look_at(target_pos, Vector3.UP) w.summon = true
可选调整
- 如果你需要墙正面朝向瞄准点(挡在你和瞄准目标之间),只需要把
target_pos的赋值替换为aimcast.get_collision_point()即可,Y轴抹平逻辑不需要修改。 - 如果你确实需要完全禁止墙绕Y轴旋转,在
global_look_at之后加一行w.rotation.y = 0即可。
内容的提问来源于stack exchange,提问作者Spiro Cromwell
相关产品推荐
相关产品推荐

