在本课程中,您将学习在 ACTION GAME MAKER 中进行基本脚本创建的方法。
第一课将制作攻击功能。
处理视觉脚本时的注意事项
-
视觉脚本与标签页
根据 Godot 的规范,无论编辑器中打开哪个场景标签页,都可以自由打开任意脚本画面。然而,视觉脚本会获取并使用当前打开的场景标签页中的节点信息。因此,如果在未附加视觉脚本的场景标签页处于打开状态时尝试设置视觉脚本,将无法获取节点信息,导致无法获取动画、变量/开关等数据,请特别注意。此外,即使误打开其他标签页,只要未对视觉脚本进行更改并返回正确的标签页,就不会出现问题。
-
视觉脚本与引用文件
由于 Godot 的规范限制,每个动作的“指定其他对象的路径”以字符串形式保存。因此,如果在文件系统中移动目标游戏对象,将导致引用路径失效。虽然提供了用于确认是否能访问引用数据的“缺失检查(Missing Check)”功能,但在开发规模扩大后再重新设置引用会非常困难。因此,强烈建议在开始开发前先整理好文件夹结构。
课程开始前的准备工作
本课程将使用与第一个教程相同的教程项目。
现在,请打开项目并做好准备工作。
步骤2:创建子弹对象 - 子弹脚本
-
创建一个新的脚本。点击场景窗口上方的
图标来创建新脚本。

-
确认语言为VisualScript,然后为其指定任意名称并创建。
-
将第一个节点重命名为Move,并启用“不受重力影响”选项。
-
通过Actions > +Add Executable Action添加执行动作“攻击设置”。指定命中组,仅设置为Enemy。这样可以避免攻击误伤玩家。
-
接着,通过添加状态创建新状态,并将其命名为Remove。同样启用“不受重力影响”选项。
-
在Remove状态中添加执行动作“删除自身(RemoveSelf)”。此操作用于将对象从游戏中移除。像子弹和敌人这样的对象,如果在完成任务后不将其移除,它们将一直存在,从而占用资源,因此务必进行移除。
-
最后,右键点击Move并创建链接,将其连接到Remove。
-
设置三个移除条件。第一个条件是“命中敌人”。通过检查器,进入Conditions > Add Condition,添加“碰撞检测与接触(ContactWithHitArea)”。由于希望无论来自哪个方向都能判定,因此判定方向设为全部,目标组设为Enemy。
-
设置第二个条件。使用相同步骤添加“屏幕外(Offscreen)”。目标类型设为当前节点,与前一条件的逻辑关系设为OR。如果保持为AND,则必须同时满足两个条件才能进行状态转移。
-
设置第三个条件。使用相同步骤添加“与图块接触(ContactWithTile)”。同样,由于希望无论来自哪个方向都能判定,因此判定方向设为全部。与前一条件的逻辑关系设为OR。
-
至此,对象将满足以下任一条件时被删除:与敌组命中、离开屏幕范围或与图块接触。
提示
关于删除(Remove)与恢复删除(RestoreRemove)、禁用(Disable)与启用(Enable)动作的区别
您可能已经注意到这些条件相似,下面将说明它们的使用区别。
删除(Remove)顾名思义,是将对象从游戏中完全移除,适用于无需复用的对象。虽然可以执行复活(RestoreRemove),但实际上会重新生成对象,因此之前的状态会被重置。
禁用(Disable)仅使对象暂时停止运行,并不会将其从游戏中移除。因此,通过启用(Enable)可以使其恢复到原始状态。这很方便,但处于Disable状态的对象仍会消耗资源,因此对于不再计划复用的对象,建议将其删除(Remove)以确保安全。
设置消失动画时的配置
本次示例未设置动画,因此对象会立即消失。但如果为Remove动作设置了动画,对象会在动画播放前就消失。
如需设置动画,建议在Remove和Move之间添加一个用于命中的状态。
当满足命中条件时,对象将转移到命中状态并播放动画。然后,通过“动画已结束”条件或“经过指定秒数”条件,再转移到Remove状态,即可实现先播放动画再移除的效果。
步骤3:为角色设置子弹和枪械
-
返回到 Object_Sampleplayer 标签页。
-
点击场景画面左上角的“添加节点”按钮。
-
添加 Node > AGMaker 中的 BulletSettings 节点。这是用于管理发射子弹的节点。
-
BulletSettings 应设置为发射子弹的侧对象。
-
展开 BulletDataList → 添加子弹(+Add Bullet)→ <空> → NewBulletData,创建新的子弹数据。
-
进行子弹的基本设置。展开 BulletData > Bullet Base Settings,并按如下方式选择:
名称:请输入任意名称,此处设为 Sample_Bullet。
对象路径:请指定刚才创建的 sample_bullet。*请注意,如果之后移动 sample_bullet.tscn 的位置,引用将失效导致无法运行。
无限子弹:开启 *关于此项,稍后将进行说明。
-
接下来设置初始行为。展开 Initial Behavior,将初始行为设置为“沿对象显示方向发射 (FireObjectDirection)”。
-
至此,子弹设置已完成。现在可以通过发射动作让 sample_bullet 沿显示方向发射。接下来为角色装备枪械。
-
选择 AnimationPlayer,选择并播放 044_Gun_Aim 动画。将播放射击动画……但角色仍然是徒手状态。
-
枪械图片已包含在随附文件中,位于文件系统的 templates > objects > weapons > P_other 目录下的 W_005_gun.png,请使用它。将其装备到左手骨骼上似乎效果不错。
-
返回场景窗口,选择 BoneAnimationRoot2d > Skeleton > B_Chest > B_Joint_L > B_Arm_L > B_Hand_L > B_Weapon_L。
-
选中 B_Weapon_L 后,将文件系统中的 W_005_gun.png 拖拽至手部附近,按住 Shift 键并释放。
-
按住 Shift 键拖拽会使该文件成为所选节点的子节点,因此 W005Gun 应作为 B_Weapon_L 的子节点被添加。如果未成功,请手动调整。
-
虽然已放置,但角度似乎有些奇怪,需要修正。选中 W005Gun,调整 Node2d > Transform 中的位置 (Position) 和角度 (Rotation)。
大致设置为 x:12, y:21, Rotation:156.4 左右即可使其看起来正常。
另外,关于为何在 0 度时仍出现倾斜,是因为父级骨骼的角度已通过动画设定为倾斜状态。
-
播放动画确认运行是否正常。如果没有问题,接下来设置发射点即枪口。
-
发射点使用名为 Connector 的节点。此示例角色中已存在一个名为 Connector - gun fire 的节点,但它似乎位于脚部,因此需要调整。将其位置与枪械图形对齐,移动到枪口附近。
-
至此,子弹、枪械和枪口的设置已完成。
子弹各项设置说明
基本设置
发射数量 (Shot Count):一次动作发射的次数。可用于实现连射或霰弹枪效果,但请注意,如果在发射过程中状态发生切换,发射可能会中途终止。
发射间隔 (Fire Interval):与发射数量配合使用,表示发射间隔。将此数值设为 0.3 秒,则每 0.3 秒发射一发子弹;设为 0 秒则实现同时发射。
子弹显示数量限制 (Shit Limit):屏幕上可显示子弹的上限数量。如果设为 1,则在已有子弹消失前无法再次发射。
初始行为
初始行为 (Initial Behavior):指定发射出的子弹如何移动。如果子弹侧已设置移动脚本,则优先执行子弹侧的脚本。
扩大发射范围 (Spread Range):指定子弹的扩散范围。
指定运动方式 (Spread Type):指定子弹的扩散方式。固定模式则在发射角度内等间隔发射;雨刷模式则在发射角度内上下移动发射;随机模式则在发射角度内随机扩散。
飞行中行为
飞行中行为 (In-flight Behavior):可指定锁定目标后的追踪或回旋镖轨迹等。如果子弹侧已设置移动脚本,则优先执行子弹侧的脚本。
步骤4:发射子弹。
- 点击 Player 旁边的
图标以打开可视化脚本。
- 在 Idle 附近创建一个新的状态 Shoot,并将动画设置为 044_Gun_Shoot。如果动画未显示任何内容,请确认您是否已打开 Object_SamplePlayer 选项卡。
- 添加一个动作来发射子弹(FireBullet)。选择 Sample_Bullet 作为子弹数据,并将连接点指定为 Connector - gun fire。这样即可从枪口发射 Sample_Bullet。
- 将 Idle 连接到 Shoot。将转换条件设置为“当按下 X 按钮(键盘上为 C 键)时”。
- 将 Shoot 连接到 Idle 的快捷方式。将转换条件设置为“动画结束后”。
- 现在,如果设置正确,您应该能够发射子弹。点击
或按 F5 键进行测试。如果子弹成功发射、击中瓦片并消失,则表示成功。
故障排除
射击动画未播放
很可能是转换失败。请确认动画是否正确设置,以及从 Idle 到 Shoot 的转换条件是否正确。
动画一直停留在射击状态
同样很可能是转换失败。请确认从 Shoot 返回 Idle 的转换是否已正确设置。
子弹未发射
可能是子弹发射动作的设置失败。
请检查:
- 是否在发射动作中正确设置了子弹数据。
- 连接点是否正确设置。
- 连接点是否位于枪口位置。
子弹只能发射一次
BulletSettings 中子弹的显示数量可能未设置为无限。
子弹未消失
请检查 sample_bullet 对象的可视化脚本。确认是否已设置 Remove 消失动作,以及三个转换条件是否通过OR连接。
第二回请参见此处