Godot中玩家角色look_at指令失效,朝向异常如何修复?
修复角色朝向问题的方案
核心错误定位
你的代码中对look_at()的调用存在参数错误:
look_at(global_position.direction_to(navigation_agent.get_next_location()))
global_position.direction_to()返回的是单位方向向量,但look_at()需要传入的是要朝向的全局位置坐标,这是导致角色朝向不符合预期的核心原因。
具体修复步骤
1. 修正移动时的朝向代码
将移动时的look_at调用修改为直接传入寻路的下一个点位置:
# 替换原来的错误调用 look_at(navigation_agent.get_next_location())
2. 避免朝向指令被覆盖
检测到敌人时你已经设置了朝向敌人,但后续的移动朝向代码会覆盖这个操作。需要添加条件判断,当有敌人在检测范围内时,优先保持朝向敌人,不再执行移动时的朝向逻辑:
修改_process函数中的逻辑:
func _process(_delta): if $RayCast2D.is_colliding(): if $RayCast2D.get_collider().is_in_group("enemy_ground_troop"): self.velocity = Vector2.ZERO ranged_attack() if navigation_agent.is_navigation_finished(): return var has_enemy = false var overlapping_areas = $EnemyDetector.get_overlapping_areas() for area in overlapping_areas: if area.is_in_group("enemy_ground_troop"): navigation_agent.set_target_location(area.get_global_position()) look_at(area.get_global_position()) has_enemy = true # 仅当没有敌人时,才执行移动朝向逻辑 if not has_enemy: velocity = global_position.direction_to(navigation_agent.get_next_location()) * speed look_at(navigation_agent.get_next_location()) $RayCast2D.global_rotation = self.global_rotation navigation_agent.set_velocity(velocity) else: # 有敌人时停止移动,保持朝向敌人 velocity = Vector2.ZERO navigation_agent.set_velocity(velocity)
3. 检查RayCast2D的同步逻辑
保留$RayCast2D.global_rotation = self.global_rotation即可,但需确保RayCast2D的旋转原点与角色节点一致,避免出现偏移。
额外注意点
- 确认角色节点的
rotation属性未被其他代码或动画控制器覆盖,如果有动画逻辑,需确保动画不会强制修改角色旋转值。 look_at()函数会自动计算角色当前位置到目标位置的旋转角度,无需手动计算方向向量传入。
内容的提问来源于stack exchange,提问作者AbsolutePickle42
相关产品推荐
相关产品推荐

