为每种类型的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”,因此将“车身类型”设置为“静态”。
然后,我想你可以确认石头的命中判断不是针对每个地图芯片的,而是组合在一起的。
现在运行游戏并确保它正常工作。