在本课程中,您将学习 ACTION GAME MAKER 中脚本的基础知识。
在 第一部分,我们将创建一个基础的 攻击系统。
使用可视化脚本的注意事项
可视化脚本与场景标签页
由于 Godot 的工作方式,从技术上讲,无论当前激活的是哪个场景标签页,您都可以打开任何可视化脚本标签页。
然而,ACTION GAME MAKER 中的可视化脚本依赖于当前打开的场景标签页中的节点。
如果您在另一个场景处于激活状态时尝试编辑可视化脚本,您将无法访问正确游戏对象中的动画数据、变量或开关。
如果发生这种情况,请勿惊慌——只需返回正确的场景标签页,不要对脚本进行任何更改。
可视化脚本与文件引用
由于 Godot 的限制,动作中对其他对象的任何引用(例如对象路径)都存储为 纯字符串。
这意味着,如果您在 文件系统 中移动被引用的游戏对象,链接将会断开,导致引用丢失。
虽然 ACTION GAME MAKER 提供了 缺失引用检查 工具,但在大型项目中修复断开的引用非常耗时。
我们强烈建议在开始开发之前妥善组织文件夹结构。
开始使用
与之前的教程一样,本课程使用第一门课程中提供的相同 教程项目。
请立即打开该项目以做好准备。
步骤 1:创建子弹对象 – 子弹设置
1. 让我们创建一个新的游戏对象场景。
在中央编辑器面板中,点击 +标签 以打开新场景标签。
然后,在场景窗口中选择 游戏对象 (Game Object)。
2. 在对象创建窗口中,配置以下内容:
- 对象名称 (Object Name):任意名称(我们将使用
sample_bullet)
- 模板 (Template):
bullets
- 类型 (Type):
bullet_base
- 组 (Group):
Player
然后点击 创建 (Create) 按钮。
3. 将生成一个具有预配置基本设置的游戏对象场景。
立即通过右键点击标签或按 Ctrl + S 保存场景,并将其保存在您喜欢的任何位置。
4. 我们需要子弹的视觉效果,但我们没有图像文件。
相反,我们将使用一个绘制矩形的 Godot 节点。
点击场景窗口左上角的 +按钮。
5. 在节点选择对话框中,前往:
节点 (Node) > 画布项 (CanvasItem) > 控件 (Control) > ColorRect 并创建它。
使用搜索栏,输入 “Color” 或 “Rect” 以轻松找到它。
6. 出现一个白色矩形。
默认情况下它相当大,所以让我们把它缩小。
在场景窗口中选择 ColorRect 节点。
7. 在 检查器 (Inspector) 中,前往:
布局 (Layout) > 变换 (Transform) 并将大小从 40×40 更改为大约 4×4。
8. 矩形是从左上角绘制的,所以让我们将其居中。
将 位置 (Position) 设置为:
x = -2
y = -2
现在,矩形已居中于场景原点。

9. 红色半透明矩形代表 攻击碰撞区域,但它太大了。
让我们调整它的大小。
- 在场景窗口中选择
AttackCollision。
- 调整角点,使其比
ColorRect 稍大一些。
10. 浅蓝色半透明方块 (CollisionShape2D) 是墙壁碰撞区域。
目前,由于重叠,墙壁会阻挡攻击。
让我们使 墙壁碰撞体比攻击范围更小。
让我们调整它的大小。
- 在场景窗口中选择
CollisionShape2D。
- 调整角点,使其比
AttackCollision 稍小一些。
10. 现在,选择 MoveAndJumpSettings 节点。
默认情况下,水平和垂直移动速度为 100 像素/秒,这非常慢。
让我们将其增加到大约 300 像素/秒。
11. 通常,您还会配置动画和其他属性,
但对于这个简单的子弹对象,不需要额外的设置。
步骤 2:创建子弹对象 – 子弹脚本
1. 让我们创建一个新的脚本。
点击场景窗口顶部的
(卷轴图标) 以创建新脚本。

2. 确保语言设置为 VisualScript,为其命名,然后点击 创建。
3. 将第一个状态节点重命名为 移动,并启用 忽略重力 选项。
4. 前往 操作 > + 添加可执行操作,并添加一个 攻击设置 操作。
将 命中组 设置为仅 Enemy(敌人),这样子弹就不会意外击中玩家。
5. 添加另一个状态节点并将其命名为 移除。
同时启用 忽略重力 选项。
6. 在 移除 状态中,添加一个名为 RemoveSelf 的 可执行操作。
这将把对象从游戏中移除。
务必在使用后清理子弹和敌人,否则它们会残留并占用系统资源。
7. 右键点击 移动 状态,并创建一条指向 移除 状态的 链接。
8. 设置第一个 过渡条件:
在检查器中,前往 条件 > 添加条件,并选择 与命中区域接触。
设置如下:
这意味着当子弹击中敌人时将被移除。
9. 添加第二个条件:离开屏幕(当子弹离开摄像机视野时)。
设置如下:
- 目标类型:此节点
- 与前一条件的逻辑关系:或 (OR)
如果将其保持为“与 (AND)”,则两个条件都必须为真才能触发,这不是我们想要的。
10. 添加第三个条件:与图块接触。
同样,将方向设置为全部,并结合使用 或 (OR)。
现在,您的子弹将在以下情况下自动被移除:
提示
移除 (Remove) 与 恢复移除 (RestoreRemove)、禁用 (Disable) 与 启用 (Enable)
您可能注意到了相似的操作,以下是它们的区别:
- 移除 (Remove):完全从游戏中删除对象。适用于不需要返回的物体,如子弹或敌人。
- 恢复移除 (RestoreRemove):复活一个已被移除的对象,但处于新生成的状态。原始状态会丢失。
- 禁用 (Disable):暂时禁用对象而不删除它。
- 启用 (Enable):重新激活被禁用的对象,并将其恢复为原始状态。
被禁用的对象仍会占用内存。
如果您不打算重用它们,请使用 移除 (Remove)。
如果您想添加消失动画
在本例中,为了简化,我们跳过了动画。
但如果您希望在子弹消失前显示动画,不要在击中后直接调用 RemoveSelf。
相反,请在 移动 和 移除 之间添加一个 中间的“命中”状态:
- 发生碰撞时过渡到
Hit 状态。
- 播放动画。
- 添加如 “动画结束” 或 “时间流逝” 之类的条件,然后过渡到
Remove。
步骤 3:为角色设置子弹和枪
1. 返回 Object_Sampleplayer 标签页。
2. 点击场景面板左上角的 添加节点 (Add Node) 按钮。
3. 从 节点 (Node) > AGMaker 中添加一个 BulletSettings 节点。
此节点用于管理要发射的子弹。
4. 展开 BulletDataList > + 添加子弹 (Add Bullet) > <空> > NewBulletData 以创建新的子弹数据。
5. 在 子弹基础设置 (Bullet Base Settings) 中配置基本子弹设置:
- 名称 (Name):设置任意名称(例如
Sample_Bullet)
- 对象路径 (Object Path):选择之前创建的
sample_bullet.tscn。
如果稍后移动此文件,引用将会失效。
- 无限子弹 (Unlimited Bullets):启用此选项
(详细信息稍后解释。)
6. 将 初始行为 (Initial Behavior) 设置为 FireObjectDirection,这将使子弹沿物体朝向的方向发射。
7. 子弹设置现已完成!
现在您可以使用射击动作,沿角色朝向的方向发射 sample_bullet。
8. 让我们将枪附加到角色上。
选择 AnimationPlayer,尝试播放动画 044_Gun_Aim。
瞄准动画会播放,但角色看起来仍然没有武器。
9. 枪的图像已默认包含在内。
在文件系统 (FileSystem) 中导航到 templates > objects > weapons > P_other。
使用 W_005_gun.png。它非常适合放在角色的左手中。
10. 在场景面板中选择:
BoneAnimationRoot2D > Skeleton > B_Chest > B_Joint_L > B_Arm_L > B_Hand_L > B_Weapon_L
11. 选中 B_Weapon_L 后,拖拽 W_005_gun.png 到手附近,并在释放时 按住 Shift 键。
这会将图像作为 B_Weapon_L 的 子节点 添加。
12. 如果操作正确,W005Gun 应该是 B_Weapon_L 的子节点。
如果没有,请手动将其移动到正确的节点下。
13. 调整角度和位置。
选择 W005Gun,并在检查器 (Inspector) 中进入 Node2D > 变换 (Transform)。
设置:
- 位置 (Position):x: 12, y: 21
- 旋转 (Rotation):156.4 度
即使旋转为 0,骨骼可能因动画而已经旋转,从而影响子节点。
14. 播放动画以确认枪在移动时看起来是否正确。
如果一切看起来都没问题,现在让我们调整 开火原点。
15. 使用 连接器 (Connector) 节点来指定子弹发射点。
虽然角色有一个名为 Connector - gun fire 的节点,但它出现在脚附近。
请将其移动到枪口处。
现在您的角色拥有子弹、枪以及正确的发射点!
子弹设置详解
基础设置
- 射击次数 (Shot Count):每次动作发射的子弹数量。
可用于连发或散弹枪效果。
如果在射击过程中状态改变,射击将停止。
- 射击间隔 (Fire Interval):多次射击中每颗子弹之间的间隔。
- 0.3 秒 = 每 0.3 秒发射一颗子弹
- 0 秒 = 同时发射所有子弹
- 射击限制 (Shot Limit):屏幕上子弹的最大数量。
初始行为
- 初始行为 (Initial Behavior):子弹发射后的移动方式。
如果子弹的脚本控制移动,该脚本将具有优先权。
- 散布范围 (Spread Range):散布角度。
- 散布类型 (Spread Type):
Fixed(固定):在散布角度内均匀分布
Wiper(扫描):在射击时来回摆动
Random(随机):在散布范围内随机角度
飞行中行为
控制发射 后 的行为。
示例:
同样,子弹自身的脚本对这些设置具有 优先权。
步骤 4:发射子弹
1. 点击 Player 旁边的
图标以打开可视化脚本。
2. 在 Idle 附近创建一个新的 Shoot 状态。
将动画设置为 044_Gun_Shoot。
如果没有显示动画,请确保已打开 Object_SamplePlayer 标签页。
3. 添加一个可执行操作:Fire Bullet(发射子弹)。
设置:
- Bullet Data(子弹数据)为
Sample_Bullet
- Connector(连接器)为
Connector - gun fire
这允许玩家从枪口发射 Sample_Bullet。
4. 连接 Idle → Shoot。
设置条件为:当按下 X 按钮时(键盘上的 C 键)。
5. 连接 Shoot → Idle(快捷方式)。
设置条件为:当动画结束时。
6. 如果一切设置正确,玩家现在应该可以射击了。
按
或按下 F5 进行测试。
如果子弹能够发射并在击中图块后消失,则成功!
故障排除
射击动画未播放
检查 Idle → Shoot 的转换是否配置正确,且动画是否正确设置。
角色永远停留在射击动画中
Shoot → Idle 的返回转换可能未正确设置。
没有子弹被发射
- 确保 Fire Bullet 操作已正确配置。
- 确认:
- 已分配 子弹数据
- 已设置 连接器
- 连接器已正确放置在 枪口 处
只能发射一颗子弹
在 BulletSettings 中,子弹限制可能未设置为无限。
子弹永远不会消失
检查 sample_bullet 的可视化脚本。
- 确保:
- Remove 状态包含正确的 RemoveSelf 操作
- 所有 3 个条件 均使用 OR(或)连接,而非 AND(且)
继续至第 2 部分
1 个赞