与其他对象的距离判断

■前提
玩家位于屏幕左侧,敌对角色位于屏幕右侧并面向左侧。
敌方的状态机(VS)设置如下:
待机 → 攻击 → 待机(快捷方式)
待机 → 攻击:当距离在128以内时
攻击 → 待机:当攻击动画结束时

  • 与其他对象的距离
  • 指定方向:与此对象相同的方向,或仅指定方向为:left_arrow:
  • 距离:128
  • 距离条件:更近
  • 目标类型:对象
  • 目标对象类型:对象
  • 目标对象路径:指定玩家的.tscn文件
  • 目标对象位置:最近的对象

在上述条件下,当进入128范围内时会建立链接,但当靠近敌人时链接会断开(大约在32以内?)。

  • 指定方向::up_left_arrow: :left_arrow: :down_left_arrow:

如果将方向指定为斜向(如:up_left_arrow::down_left_arrow:),即使在敌人附近也能正常工作。

这是否是预期行为?

经确认,此为系统设定。

关于与其他对象之间的距离条件:

  • 方向将生成一个扇形判定范围,覆盖8个方向,每个方向间隔45°。
  • 距离和方向的判定基于 GameObject 的“原点”位置。

因此,如果两个对象的原点均位于其顶部,且两者高度差异较大,则会出现如下图所示的情况,即“虽满足距离判定,但已超出左侧范围”。

为避免此类问题,您可以将对象的原点位置调整为水平对齐,或将判定范围扩展至左上、左下等方向。

原来是通过指定半径的圆(和角度)进行判定啊。
我理解这是系统设定。
那么,“与攻击判定的距离”是否也是同样的设定呢?

顺便问一下,是否存在仅比较简单 X 位置(或 Y 位置)的条件?
例如:像“咚顿”那样,在存在高低差的情况下靠近时就会掉落之类的效果。

如果在 Visual Studio 中实现,我理解是需要准备一个变量,将期望的判定距离加到或减去玩家的 X 坐标,然后在循环中每次更新,再判断是否大于或小于敌人的 X 坐标,但感觉相当麻烦……

或者,这是指最近新增的“通过脚本进行条件判定”功能的使用方式吗?
我还没有使用过“通过脚本进行条件判定”,希望能提供一个简单的实现示例。

检查与攻击判定的距离。

虽然没有简单的 X 位置比较,但正如您所指出的,可以通过使用“脚本条件判断”来解决。

提供一个简单的示例:

  1. 在要设置的对象的子节点下准备一个 Node2D。image

  2. 为 Node2D 附加 GD 脚本,并用以下内容覆盖。以下表达式是一个名为 is_player_in_x_range 的方法,当 Player 组的对象进入 100 范围内时返回 TRUE。

    extends Node2D
    
    @export var attack_range := 100.0
    var player: Node2D
    
    func _ready():
        # 自动获取注册在组“Player”中的对象
        player = get_tree().get_first_node_in_group("Player")
    
    func is_player_in_x_range() -> bool:
        if not player:
            return false
    
        # 仅根据 X 坐标差进行判断
        var diff_x = abs(global_position.x - player.global_position.x)
        return diff_x <= attack_range
    
  3. 在“脚本条件判断”中指定创建的 Node2D,并将方法指定为 is_player_in_x_range

“执行脚本”和“脚本条件判断”就是这样利用附加到子节点的 GDScript 方法作为条件或动作的功能。

func 后面跟着的波浪线 ~~~~ 表示方法。通过在这个 GDScript 中继续添加更多方法,可以灵活地使用各种方法。

1 个赞

谢谢!
我正好也在用类似的方式编写 GDScript,哈哈。
关于通过链接进行条件判断,确实可以设计成从方法返回布尔值。

不过,我想尝试另一种方式:在执行动作时始终调用方法,并保存 x 距离和 y 距离。
我希望能将这些值存储到 GameObject 的 VariableSettings 中用户自定义的变量里。
请问在 GDScript 中该如何指定呢?

例如:我想将值赋给名为 distance_x 的用户自定义变量。

将变量数据赋值 $“到 VariableSettings 的路径”.set_value(“变量名”, 要赋的值)

这样是否只需自行定义变量名“distance_x”即可?

是的,我觉得那边应该没问题。

1 个赞

成功了!谢谢 :folded_hands:

1 个赞

关于与攻击判定的距离,情况也类似:

即“GameObject 的原点”与“攻击判定(AttackArea2D)的形状原点”之间的距离。

1 个赞