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

- 距离:128
- 距离条件:更近
- 目标类型:对象
- 目标对象类型:对象
- 目标对象路径:指定玩家的.tscn文件
- 目标对象位置:最近的对象
在上述条件下,当进入128范围内时会建立链接,但当靠近敌人时链接会断开(大约在32以内?)。
如果将方向指定为斜向(如
、
),即使在敌人附近也能正常工作。
这是否是预期行为?
经确认,此为系统设定。
关于与其他对象之间的距离条件:
- 方向将生成一个扇形判定范围,覆盖8个方向,每个方向间隔45°。
- 距离和方向的判定基于 GameObject 的“原点”位置。
因此,如果两个对象的原点均位于其顶部,且两者高度差异较大,则会出现如下图所示的情况,即“虽满足距离判定,但已超出左侧范围”。
为避免此类问题,您可以将对象的原点位置调整为水平对齐,或将判定范围扩展至左上、左下等方向。
原来是通过指定半径的圆(和角度)进行判定啊。
我理解这是系统设定。
那么,“与攻击判定的距离”是否也是同样的设定呢?
顺便问一下,是否存在仅比较简单 X 位置(或 Y 位置)的条件?
例如:像“咚顿”那样,在存在高低差的情况下靠近时就会掉落之类的效果。
如果在 Visual Studio 中实现,我理解是需要准备一个变量,将期望的判定距离加到或减去玩家的 X 坐标,然后在循环中每次更新,再判断是否大于或小于敌人的 X 坐标,但感觉相当麻烦……
或者,这是指最近新增的“通过脚本进行条件判定”功能的使用方式吗?
我还没有使用过“通过脚本进行条件判定”,希望能提供一个简单的实现示例。
检查与攻击判定的距离。
虽然没有简单的 X 位置比较,但正如您所指出的,可以通过使用“脚本条件判断”来解决。
提供一个简单的示例:
-
在要设置的对象的子节点下准备一个 Node2D。
-
为 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
-
在“脚本条件判断”中指定创建的 Node2D,并将方法指定为 is_player_in_x_range。
“执行脚本”和“脚本条件判断”就是这样利用附加到子节点的 GDScript 方法作为条件或动作的功能。
func 后面跟着的波浪线 ~~~~ 表示方法。通过在这个 GDScript 中继续添加更多方法,可以灵活地使用各种方法。
1 个赞
谢谢!
我正好也在用类似的方式编写 GDScript,哈哈。
关于通过链接进行条件判断,确实可以设计成从方法返回布尔值。
不过,我想尝试另一种方式:在执行动作时始终调用方法,并保存 x 距离和 y 距离。
我希望能将这些值存储到 GameObject 的 VariableSettings 中用户自定义的变量里。
请问在 GDScript 中该如何指定呢?
例如:我想将值赋给名为 distance_x 的用户自定义变量。
| 将变量数据赋值 |
$“到 VariableSettings 的路径”.set_value(“变量名”, 要赋的值) |
这样是否只需自行定义变量名“distance_x”即可?
关于与攻击判定的距离,情况也类似:
即“GameObject 的原点”与“攻击判定(AttackArea2D)的形状原点”之间的距离。
1 个赞