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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 16:46:08