关于本手册
本手册讲解碰撞相性检查,以及创建对象时选择的碰撞角色(碰撞模板)。它们用于在不必阅读数字的前提下,确认并修正由层与遮罩不匹配引起的问题,例如「攻击打不到敌人」「玩家撞到敌人过不去」等。
ACTION GAME MAKER 中层/遮罩的思路
碰撞具有 层(自己是什么)和 遮罩(自己以什么为对象),能否成立取决于一方的遮罩中是否包含另一方的层。这里不匹配的话,无论怎样调整判定的形状都打不中。
| 哪种判定 | 成立的条件 |
|---|---|
| 墙壁(碰撞・互相推挤) | 自己的墙壁遮罩 ∩ 对方的墙壁层 |
| 攻击 | 攻击方的攻击遮罩 ∩ 承受方的受击层 |
| 可视化脚本的「与〜接触」 | 自己的墙壁遮罩 ∩ 对方的墙壁层 |
墙壁是左右两侧分别决定的。 完全可能出现「A 会撞上 B,但 B 不会被 A 挡住」的状态,此时 B 会单方面把 A 推开。想要互相穿过,必须两边都取消。
有些字段在运行时并不会被使用。 攻击只看「遮罩」,受击只看「层」。改变攻击判定的层或受击判定的遮罩,都不会改变命中的结果。
碰撞相性检查
这是一个选择 2 个对象后,就会用文字显示是否会碰撞・攻击能否命中・接触条件能否成立的窗口。不必逐位比对,只要读结果就行。
打开方式
- 检查器中的「碰撞相性检查」按钮(选中游戏对象、攻击判定、受击判定时会出现)
- 在对象制作视图中,也可以从上方固定工具栏的同一按钮打开
打开时的初始状态是 A 为当前正在编辑的对象,B 为瓦片(地形)。
画面的构成
- 上排左侧是 A,上排右侧是 B。可以用中央的「⇄」互换。
- 用各面板的「选择对象…」来选择场景(
.tscn)。默认位置是res://objects/gameobjects。 - 用「瓦片」按钮可以把那一侧设为瓦片(地形)。瓦片被视作层 1。
- 判定结果显示在下排。
可编辑的 4 个栏位
各面板中只排列着运行时判定实际使用的这 4 项。
| 栏位 | 含义 |
|---|---|
| 墙壁层 | 这个对象是什么(会被对方遮罩拾取的一侧) |
| 墙壁遮罩 | 这个对象想要碰撞的对象 |
| 攻击遮罩 | 想要命中的对象的受击层 |
| 受击层 | 这个对象的受击判定是什么 |
按下数字按钮(层 1 〜 8)会当场切换,下方的判定结果会立即更新。 如果使用了层 9 以上,这些设置会被保留,但无法在本画面中编辑。
此时尚未写入场景。 如果只是按来按去做比较,直接关闭窗口也不会改变原来的对象。在窗口内可以用 Ctrl+Z / Ctrl+Shift+Z 撤销和重做操作。
判定结果的读法
结果分为 3 部分显示。
墙壁(碰撞・互相推挤)
- 「A 和 B 会碰撞并互相推挤」
- 「A 撞上 B 会被挡住,但 B 不会被 A 挡住」→ B 可以单方面把 A 推开
- 「A 和 B 会互相穿过」
- 对方是瓦片时,只取决于对象一侧的墙壁遮罩中是否包含层 1(因为瓦片不会移动)
- 对于轻量对象,或没有有效墙壁判定形状的情况,会显示相应的说明
攻击 → 受击
- 会在 A→B 和 B→A 两个方向上显示「A 的攻击能命中 B」/「不能命中」
- 承受方没有受击判定(HitArea2D)时,会提示「由于没有受击判定,无法命中」
- 瓦片不具备攻击判定・受击判定,因此不在对象范围内
- 若 A 和 B 选择了同一个对象,会以「同种存在多个时的关系」来显示(攻击不会命中自身)
可视化脚本的接触判定
- 会在两个方向上显示「A 的接触条件能检测到 B」/「不能」
- 「与〜接触」类的条件默认使用该对象的墙壁遮罩。 也就是说,改变墙壁遮罩会同时改变接触条件的成立与否
- 在条件一侧打开「设置碰撞掩码」,就能为该条件单独指定一个独立的遮罩
- 对方是轻量对象(Area2D)时,需要在条件一侧打开「与区域的判定(collide_with_areas)」
写入到对象
- 点击「应用模板」,可以把各角色的推荐设置读入工作副本(后述)。
- 用「应用到对象」把变更写入对象。可以撤销。
- 能够写入的只有当前正在编辑的对象。 另一侧选择的其他场景只能做「试改」,不会保存到场景中。
- 若在存在未应用变更的状态下尝试关闭,会弹出是否应用的确认。
碰撞角色(模板)
这是一套先约定好层号的含义,然后只需选择角色就能一次性设置墙壁・攻击・受击的机制。
层号的分配
仅在使用模板时,会按以下分配进行设置。
| 层 | 角色 |
|---|---|
| 1 | 瓦片(地形) |
| 2 | 玩家 |
| 3 | 玩家的子弹 |
| 4 | 敌人 |
| 5 | 敌人的子弹 |
| 6 | 友方NPC |
| 7 以上 | 预留(可自由使用) |
它并不会改写既有项目的设置。 此前做好的对象保持原样,只有应用了模板的对象才会采用这套分配。混用会导致相性不匹配,因此若中途开始使用,请把相关的对象统一整理成一致。
可用的模板
| 名称 | 会怎样 | 墙壁层 | 墙壁遮罩 | 攻击遮罩 | 受击层 |
|---|---|---|---|---|---|
| 标准玩家 | 与瓦片・敌人互相推挤,攻击能命中敌人和敌人的子弹,并会承受敌人的攻击 | 2 | 1, 4 | 4, 5 | 2 |
| 不会被敌人挡住的玩家 | 不会撞到敌人,可以直接通过 | 2 | 1 | 4, 5 | 2 |
| 标准敌人 | 与瓦片・玩家互相推挤,敌人之间会互相穿过 | 4 | 1, 2 | 2, 3 | 4 |
| 敌人之间也互相推挤的敌人 | 在标准敌人的基础上,敌人之间也会互相推挤 | 4 | 1, 2, 4 | 2, 3 | 4 |
| 不会被玩家挡住的敌人 | 不会撞到玩家,可以直接通过 | 4 | 1 | 2, 3 | 4 |
| 能穿墙的敌人(完全穿透) | 完全不会与墙壁・其他对象发生碰撞 | 无 | 无 | 2, 3 | 4 |
| 玩家的子弹 | 攻击能命中敌人和敌人的子弹(相互抵消) | 3 | 1 | 4, 5 | 3 |
| 敌人的子弹 | 攻击能命中玩家和玩家的子弹(相互抵消) | 5 | 1 | 2, 3 | 5 |
| 友方NPC | 与瓦片・敌人互相推挤,与玩家之间会互相穿过 | 6 | 1, 4 | 4, 5 | 6 |
| 道具・接触机关 | 不做物理推挤,用自身的接触条件来检测玩家 | 无 | 2 | 无 | 无 |
| 可破坏的立足点 | 因为与瓦片同属一个墙壁层,所以可以站上去,并且能被玩家的攻击破坏 | 1 | 1 | 无 | 4 |
「不会被〜挡住」这一类,只对单侧应用的话,就会变成单方面推开对方的关系。想让双方互相穿过时,请对两边都应用「不会被〜挡住」类的模板。
创建对象时进行选择
对象创建的对话框中有「碰撞角色」下拉菜单。
- 候选项会按选中的对象组进行筛选。 Player 组只列出玩家相关的,Enemy 组只列出敌人相关的;未设置或其他组时则全部列出。
- 每个组一开始就已选中默认角色(玩家的话是「标准玩家」等)。就这样创建即可得到匹配的设置。
- 选择「模板标准」时,会直接使用模板原本自带的值(不会应用角色的分配)。
- 选择了轻量对象时,墙壁层会变成「无」(因为它不做物理推挤)。
应用到已有的对象
从碰撞相性检查的「应用模板」读入,再用「应用到对象」确定。刚读入时只是工作副本,因此可以先看结果文字再确定。
实用示例
玩家的攻击会打到友方
按照以往的习惯,生成时会把墙壁・攻击・受击全部设为相同的值,因此玩家的攻击遮罩中有时会包含玩家自身的层。
- 选中玩家,打开碰撞相性检查。
- 在 B 中选择友方(或玩家自身)。
- 如果「攻击 → 受击」显示「能命中」,那就是原因所在。
- 从玩家一侧的攻击遮罩中去掉友方的层,然后点击「应用到对象」。
对双方都应用角色模板的话,就不会再出现这种组合了。
想穿过敌人前进
- 把玩家和敌人分别放到 A / B。
- 确认「墙壁(碰撞・互相推挤)」显示为「互相推挤」。
- 对玩家应用「不会被敌人挡住的玩家」,对敌人应用「不会被玩家挡住的敌人」。
- 结果变为「互相穿过」即完成。
只做单边的话会变成「单方面推开」的状态,被推的一方有可能被挤进墙里。
子弹打不到敌人
- 把子弹设为 A,敌人设为 B。
- 在「攻击 → 受击」中查看子弹一侧的攻击遮罩里是否包含敌人的受击层。
- 如果没有,就对子弹应用「玩家的子弹」。
撞到墙壁时让子弹消失的处理不包含在模板中。 请用可视化脚本制作「接触后消失」。
注意事项
- 改变墙壁遮罩,可视化脚本接触条件的结果也会改变。 这是因为「与〜接触」类的条件默认使用墙壁遮罩。只想改变推挤关系时,请用条件一侧的「设置碰撞掩码」让它独立。
- 攻击只使用遮罩,受击只使用层。 改变攻击判定的层或受击判定的遮罩,都不会改变命中结果(正因如此,相性检查的画面中也没有显示它们)。
- 「应用到对象」只能写入正在编辑的对象。 另一侧选择的场景只能做试改。如果对方也需要修改,请打开那个对象后做同样的操作。
- 角色模板的分配与既有项目的设置属于不同的体系。 混用会破坏相性,若要使用,请把相关的对象统一整理成一致。
- 瓦片是层 1。 从墙壁遮罩中去掉层 1,就会穿过地形一直往下掉。
- 「能穿墙的敌人」的墙壁层也会变成 0。 这样它也不会被其他对象的接触条件检测到,因此如果有需要靠接触来触发反应的对象,就不能使用它。
- 轻量对象不会做推挤。 要让对方的接触条件拾取它,需要在条件一侧打开「与区域的判定(collide_with_areas)」。
- 使用了层 9 以上的设置,无法在相性检查的画面中编辑(但会被保留)。