教程:脚本课程 #1 – 让我们创建一个射击攻击

在本课程中,您将学习 ACTION GAME MAKER 中脚本的基础知识。
第一部分,我们将创建一个基础的 攻击系统


:warning: 使用可视化脚本的注意事项


:bookmark_tabs: 可视化脚本与场景标签页

由于 Godot 的工作方式,从技术上讲,无论当前激活的是哪个场景标签页,您都可以打开任何可视化脚本标签页。
然而,ACTION GAME MAKER 中的可视化脚本依赖于当前打开的场景标签页中的节点

如果您在另一个场景处于激活状态时尝试编辑可视化脚本,您将无法访问正确游戏对象中的动画数据、变量或开关。

:small_blue_diamond: 如果发生这种情况,请勿惊慌——只需返回正确的场景标签页,不要对脚本进行任何更改


:file_folder: 可视化脚本与文件引用

由于 Godot 的限制,动作中对其他对象的任何引用(例如对象路径)都存储为 纯字符串

这意味着,如果您在 文件系统 中移动被引用的游戏对象,链接将会断开,导致引用丢失。

虽然 ACTION GAME MAKER 提供了 缺失引用检查 工具,但在大型项目中修复断开的引用非常耗时。

:white_check_mark: 我们强烈建议在开始开发之前妥善组织文件夹结构。


:white_check_mark: 开始使用

与之前的教程一样,本课程使用第一门课程中提供的相同 教程项目
请立即打开该项目以做好准备。

步骤 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
    现在,矩形已居中于场景原点。

image


9. 红色半透明矩形代表 攻击碰撞区域,但它太大了。

让我们调整它的大小。

  • 在场景窗口中选择 AttackCollision
  • 调整角点,使其比 ColorRect 稍大一些。


10. 浅蓝色半透明方块 (CollisionShape2D) 是墙壁碰撞区域。

目前,由于重叠,墙壁会阻挡攻击。
让我们使 墙壁碰撞体比攻击范围更小

让我们调整它的大小。

  • 在场景窗口中选择 CollisionShape2D
  • 调整角点,使其比 AttackCollision 稍小一些。


10. 现在,选择 MoveAndJumpSettings 节点。

默认情况下,水平和垂直移动速度为 100 像素/秒,这非常慢。
让我们将其增加到大约 300 像素/秒


11. 通常,您还会配置动画和其他属性,

但对于这个简单的子弹对象,不需要额外的设置。

步骤 2:创建子弹对象 – 子弹脚本


1. 让我们创建一个新的脚本。

点击场景窗口顶部的 :scroll:(卷轴图标) 以创建新脚本。

image


2. 确保语言设置为 VisualScript,为其命名,然后点击 创建


3. 将第一个状态节点重命名为 移动,并启用 忽略重力 选项。


4. 前往 操作 > + 添加可执行操作,并添加一个 攻击设置 操作。

命中组 设置为仅 Enemy(敌人),这样子弹就不会意外击中玩家。


5. 添加另一个状态节点并将其命名为 移除

同时启用 忽略重力 选项。


6. 在 移除 状态中,添加一个名为 RemoveSelf可执行操作

这将把对象从游戏中移除。
务必在使用后清理子弹和敌人,否则它们会残留并占用系统资源。


7. 右键点击 移动 状态,并创建一条指向 移除 状态的 链接


8. 设置第一个 过渡条件

在检查器中,前往 条件 > 添加条件,并选择 与命中区域接触
设置如下:

  • 方向:全部
  • 目标组:Enemy(敌人)

这意味着当子弹击中敌人时将被移除。


9. 添加第二个条件:离开屏幕(当子弹离开摄像机视野时)。

设置如下:

  • 目标类型:此节点
  • 与前一条件的逻辑关系或 (OR)

:warning: 如果将其保持为“与 (AND)”,则两个条件都必须为真才能触发,这不是我们想要的。


10. 添加第三个条件:与图块接触

同样,将方向设置为全部,并结合使用 或 (OR)


:white_check_mark: 现在,您的子弹将在以下情况下自动被移除:

  • 击中敌人
  • 离开屏幕
  • 与图块发生碰撞

:light_bulb: 提示

:firecracker: 移除 (Remove) 与 恢复移除 (RestoreRemove)、禁用 (Disable) 与 启用 (Enable)

您可能注意到了相似的操作,以下是它们的区别:

  • 移除 (Remove):完全从游戏中删除对象。适用于不需要返回的物体,如子弹或敌人。
  • 恢复移除 (RestoreRemove):复活一个已被移除的对象,但处于新生成的状态。原始状态会丢失。
  • 禁用 (Disable):暂时禁用对象而不删除它。
  • 启用 (Enable):重新激活被禁用的对象,并将其恢复为原始状态。

:warning: 被禁用的对象仍会占用内存。
如果您不打算重用它们,请使用 移除 (Remove)


:film_frames: 如果您想添加消失动画

在本例中,为了简化,我们跳过了动画。
但如果您希望在子弹消失前显示动画,不要在击中后直接调用 RemoveSelf

相反,请在 移动移除 之间添加一个 中间的“命中”状态

  1. 发生碰撞时过渡到 Hit 状态。
  2. 播放动画。
  3. 添加如 “动画结束”“时间流逝” 之类的条件,然后过渡到 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

:warning: 如果稍后移动此文件,引用将会失效。

  • 无限子弹 (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 度

:light_bulb: 即使旋转为 0,骨骼可能因动画而已经旋转,从而影响子节点。


14. 播放动画以确认枪在移动时看起来是否正确。

如果一切看起来都没问题,现在让我们调整 开火原点


15. 使用 连接器 (Connector) 节点来指定子弹发射点。

虽然角色有一个名为 Connector - gun fire 的节点,但它出现在脚附近。
请将其移动到枪口处。


:white_check_mark: 现在您的角色拥有子弹、枪以及正确的发射点!


:hammer_and_wrench: 子弹设置详解

:small_blue_diamond: 基础设置

  • 射击次数 (Shot Count):每次动作发射的子弹数量。
    可用于连发或散弹枪效果。

:warning: 如果在射击过程中状态改变,射击将停止。

  • 射击间隔 (Fire Interval):多次射击中每颗子弹之间的间隔。
    • 0.3 秒 = 每 0.3 秒发射一颗子弹
    • 0 秒 = 同时发射所有子弹
  • 射击限制 (Shot Limit):屏幕上子弹的最大数量。
    • 如果为 1,则必须等待上一颗子弹消失。

:small_blue_diamond: 初始行为

  • 初始行为 (Initial Behavior):子弹发射后的移动方式。

:warning: 如果子弹的脚本控制移动,该脚本将具有优先权

  • 散布范围 (Spread Range):散布角度。
  • 散布类型 (Spread Type)
    • Fixed(固定):在散布角度内均匀分布
    • Wiper(扫描):在射击时来回摆动
    • Random(随机):在散布范围内随机角度

:small_blue_diamond: 飞行中行为

控制发射 的行为。
示例:

  • 追踪已锁定的目标
  • 回旋镖式的弧线

:warning: 同样,子弹自身的脚本对这些设置具有 优先权

步骤 4:发射子弹


1. 点击 Player 旁边的 :scroll: 图标以打开可视化脚本。


2. 在 Idle 附近创建一个新的 Shoot 状态。

将动画设置为 044_Gun_Shoot

:warning: 如果没有显示动画,请确保已打开 Object_SamplePlayer 标签页。


3. 添加一个可执行操作:Fire Bullet(发射子弹)。

设置:

  • Bullet Data(子弹数据)为 Sample_Bullet
  • Connector(连接器)为 Connector - gun fire

这允许玩家从枪口发射 Sample_Bullet


4. 连接 Idle → Shoot

设置条件为:当按下 X 按钮时(键盘上的 C 键)。


5. 连接 Shoot → Idle(快捷方式)

设置条件为:当动画结束时


6. 如果一切设置正确,玩家现在应该可以射击了。

:play_button: 或按下 F5 进行测试。
如果子弹能够发射并在击中图块后消失,则成功!


:hammer_and_wrench: 故障排除


:cross_mark: 射击动画未播放

检查 Idle → Shoot 的转换是否配置正确,且动画是否正确设置。


:cross_mark: 角色永远停留在射击动画中

Shoot → Idle 的返回转换可能未正确设置。


:cross_mark: 没有子弹被发射

  • 确保 Fire Bullet 操作已正确配置。
  • 确认:
    • 已分配 子弹数据
    • 已设置 连接器
    • 连接器已正确放置在 枪口

:cross_mark: 只能发射一颗子弹

BulletSettings 中,子弹限制可能未设置为无限。


:cross_mark: 子弹永远不会消失

检查 sample_bullet 的可视化脚本。

  • 确保:
    • Remove 状态包含正确的 RemoveSelf 操作
    • 所有 3 个条件 均使用 OR(或)连接,而非 AND(且)

:right_arrow: 继续至第 2 部分

1 个赞