如何让对象朝向鼠标位置旋转?Godot子弹旋转失效问题求助
解决子弹旋转失效问题
核心问题分析
- 原子弹脚本中每帧调用
look_at(get_global_mouse_position())会让子弹持续追踪实时鼠标位置,而非保持飞行方向固定旋转,逻辑错误且易导致旋转异常。 - 未在子弹生成阶段直接锁定朝向,反而依赖帧更新,既浪费性能又不符合射击逻辑。
修正方案
1. 修改玩家脚本,生成子弹时直接设置旋转
在disparar函数中添加旋转设置,让子弹从发射瞬间就朝向目标方向:
@onready var markPos = $pistola.get_child(0) var _bullet := preload("res://Scenes/balas.tscn") func _unhandled_input(event): if Input.is_action_just_pressed("disparar"): disparar() func disparar(): # Shoot - var ratonD = get_global_mouse_position() var new_b = _bullet.instantiate() new_b.global_position = markPos.global_position new_b.dirct = (ratonD - new_b.global_position).normalized() # 直接设置子弹全局旋转朝向目标方向 new_b.global_rotation = new_b.dirct.angle() get_parent().add_child(new_b)
2. 简化子弹脚本,移除多余的帧更新旋转逻辑
删除子弹脚本中每帧执行的look_at调用,仅保留移动逻辑:
var velocidad_b = 750 var damage: float = 10.0 var dirct = Vector2.ZERO func _process(delta): position += dirct * velocidad_b * delta
额外注意事项
- 若子弹Sprite显示方向与预期不符(如默认朝上但需朝右),可在Sprite2D属性中调整Rotation Degrees偏移值,或在代码中给
global_rotation加上PI/2(因Vector2.angle()以右为0度顺时针旋转,多数素材默认朝上)。 - 检查子弹节点的**轴心点(Pivot)**是否设为Center,否则旋转会出现偏移,在Sprite2D的Inspector面板中可直接设置。
- 若坚持使用
look_at,只需在生成子弹时调用一次new_b.look_at(ratonD),而非每帧执行,避免子弹飞行中追踪鼠标。
内容的提问来源于stack exchange,提问作者user27156709
相关产品推荐
相关产品推荐

