为每种类型的MapChip实现命中检测

更新页 :
页面创建日期 :

验证环境

窗户
  • 视窗 11
统一编辑器
  • 2021.3.3f1
输入系统包
  • 1.3.0

此提示的先决条件

作为此提示描述的前提,已预先进行了以下设置。

此提示的先决条件是什么?

关于借用地图材质

我们处理从以下网站借来的。

起先

这一次,MapChips被放置在一个TileMap中,并根据放置的MapTip的类型决定是否执行命中确定。

由于此提示与另一个提示“使用磁贴地图实现命中检测”大致相同, 有关详细说明,请参阅那里。 在这里,仅对相同的内容解释了该过程,并且仅添加了差异。

行走字符的实现

首先,准备一个精灵图像,玩家将控制该图像来执行命中检测操作,并将其添加到项目中。 这一次,地图提示的大小为 32 像素,因此我将使图像大小相同。

这次我将省略步行动画,因为如果实现该过程会很长。 如果要实现它,请参阅以下提示。

选择添加到项目中的图像。 由于我们要将单位与地图芯片匹配,因此将“每单位像素数”设置为“32”。

配置完成后,单击下面的“应用”按钮。

设置图像后,将图像拖放到视图中并添加对象。

设置角色的移动过程。 添加脚本并将其保留为 Player .

脚本如下所示: 这是一个简单的移动过程,用键盘移动精灵。

using UnityEngine;
using UnityEngine.InputSystem;

public class Player : MonoBehaviour
{
  // 一定時間ごとに呼ばれます
  void FixedUpdate()
  {
    // キーボードの情報を取得
    var keyboard = Keyboard.current;

    // スプライトの移動処理
    if (keyboard.leftArrowKey.isPressed)
    {
      transform.Translate(-0.1f, 0, 0, Space.World);
    }
    if (keyboard.rightArrowKey.isPressed)
    {
      transform.Translate(0.1f, 0, 0, Space.World);
    }
    if (keyboard.upArrowKey.isPressed)
    {
      transform.Translate(0, 0.1f, 0, Space.World);
    }
    if (keyboard.downArrowKey.isPressed)
    {
      transform.Translate(0, -0.1f, 0, Space.World);
    }
  }
}

您创建的脚本附加到字符对象。

运行游戏并检查角色是否随键盘移动。

准备地图提示

准备地图提示图像并将其添加到工程中。 随着地图芯片数量的增加,设置变得麻烦,所以这次我们只准备了两个方块,一个可以走,一个不能走。

选择您添加到项目中的图像并配置 MapChip 的设置。 有关详细信息,请参阅以下提示:

配置完成后,单击“应用”按钮,然后单击“精灵编辑器”按钮。

除以 32 像素。

选择“平铺”调色板选项卡以创建调色板。 如果没有选项卡,您可以使用“窗口> 2D -> Tile Palette”从菜单中显示它们。 调色板名称可以是任何东西,但这里是“MapChipPalette”。

由于我们将它保存在一个文件夹中,因此在场景文件夹中创建一个新的“MapChipPalette”文件夹并指定它。

MapChipPalette 文件夹已添加到项目中。

接下来,您将地图提示添加到选项板。 将拆分的地图提示图像拖放到调色板上。

地图提示已添加到调色板中。

创建地图

将命中检测设置放在一边,先创建地图。 您可以稍后设置命中检测。 首先,将磁贴地图添加到层次结构。

添加后,选择“磁贴图”。 视图将显示一个网格。

首先,设置一个不会在视图中成为墙的地图芯片。

暂时,我把它放在了所有地方。

接下来,放置将用作墙壁的石制地图尖。

这次没有问题,但是如果您的角色要在地图上后面,请将图层顺序设置为大于图块地图的数字。

当然,即使此时移动游戏,也会从墙上溜走。

地图芯片命中检测设置

从这里开始,我们将设置是否为每种类型的地图芯片输入命中判断。 首先,打开您在创建调色板时创建的“MapChipPalette”文件夹。

里面的调色板中设置了一个地图提示,因此首先选择一个可以行走的地图提示。

在检查器中,将“碰撞体类型”值设置为“无”。 稍后,您将向 Tilemap 添加碰撞检测设置,但将其设置为“无”将防止此地图芯片发生冲突。

另一个石材地图提示设置为“网格”。 由于这次不是透明地图提示,所以“精灵”没有问题,但如果将其设置为“精灵”,则不会通过点击图像的透明部分来判断。

这就是MapTip的全部内容。 这很容易,因为这次只有两个,但是如果你有大量的地图芯片,你需要设置那么多。

碰撞检测设置

从这里开始,它与“使用瓦片地图实现命中检测”的内容几乎相同。

首先,为字符冲突检测进行必要的设置。 添加“物理 2D -> 圆形对撞机 2D”作为组件。 这次,精灵是圆形的,所以我把它做了一个圆形,但请根据形状选择盒子或胶囊。

我们还将添加“物理 2D -> 刚体 2D”。

将重力刻度设置为 0 以防止重力下降。 此外,检查 Z 中的“修复旋转”以防止角色旋转。

对于瓦片地图,添加瓦片地图 -> 瓦片地图碰撞体 2D 组件。

您可以看到视图中的石材地图提示周围添加了一条绿线。 这意味着命中检测仅针对宝石设置。 您可以看到上面调色板中地图提示的碰撞体类型设置已反映出来。

尝试运行游戏并走向墙壁。 我认为你可以确保角色正确地停在墙前。 您可以看到,无需编写任何与命中检测相关的程序即可轻松实现它。

结合地图芯片命中检测

如下面的提示所述,当您实际移动它时,墙壁撞击检测的行为有点奇怪。 下面的提示中介绍了原因和解决方法。

但是,通过组合地图芯片的命中检测部分,奇怪的行为将得到纠正,同时将减少处理负载,因此让我们至少这样做。

首先,在 Tilemap Collider 2D 中选中“在复合中使用”。

在“添加组件”下,选择“物理场 2D-> 复合碰撞体 2D”。

还将添加“刚体2D”,因此将“车身类型”设置为“静态”。

然后,我想你可以确认石头的命中判断不是针对每个地图芯片的,而是组合在一起的。

现在运行游戏并确保它正常工作。