二维瓦片贴图资产工作流程:从图像到水平

在 Unity 2017.2 中,我们为 2D 功能集引入了新的内容:瓦片地图使用瓦片贴图,您可以结合 Sprites 和 GameObjects 快速布局和创建 2D 关卡,并可控制层排序、瓦片贴图碰撞器、动画瓦片等属性!在这篇博文中,我将介绍从将图像文件导入 Unity 开始,一直到完成 2D 平台游戏关卡布局的整个工作流程!
简而言之,工作流程可以这样概括,每个元素都与 Unity 编辑器中的资产或组件相关:
精灵 -> 瓦片 -> 调色板 -> 画笔 -> 瓦片贴图
从非 Unity 的角度来看,这些术语可能显得有些抽象。想象一下在现实生活中的画布上作画的过程吧:
颜色 -> 涂料 -> 调色板 -> 画笔 -> 画布
流程的每个步骤都有相似的逻辑,甚至每个步骤的名称也相似!
在这篇文章中,我将使用这个 "GrassPlatform_TileSet "图像作为主要示例:

最终的结果是,这些碎片构成了一个关卡,2D 角色可以在这个 "关卡 "上奔跑:

将图像导入 Unity 的方法有多种:
- 将所需的图像文件保存到项目的 "资产 "文件夹中。
- 从顶部菜单中选择 "资产 -> 导入新资产",然后选择所需的文件。
- 将图像文件从文件浏览器拖入 Unity 编辑器中的 "项目窗口"(这可能是最简单的方法!)。
图像导入项目后,其默认纹理类型导入设置由项目当前设置的行为模式决定:2D 或 3D
该模式最初是在创建新项目时设置的:

也可以在 "编辑器设置 "中更改:

由于我的项目已经设置为 2D 行为模式,因此 "GrassPlatform_TileSet "会自动导入 "Sprite(2D 和 UI)"纹理类型,这是磁贴资产引用 Sprite 时所需的设置。
由于 "GrassPlatform_TileSet "是一个图像中的一系列精灵,我们需要将其分割成单个精灵;将 "Sprite Mode(精灵模式)"从 "Single(单个)"设置为 "Multiple(多个)",然后打开 "Sprite Editor(精灵编辑器)"即可:

通过 "精灵编辑器 "窗口,您可以将图像 "分割 "成多个精灵;这样,您就可以在所需的图像编辑软件中处理一个精灵表,并直接在 Unity 中定义图像的哪些区域被视为 "单独 "的精灵。无需处理和管理数百个单独的图像文件!
由于 "GrassPlatform_TileSet "是由一系列瓷砖合成的图像,我们可以使用 "精灵编辑器 "的 "网格切片设置 "将图像自动分割成多个精灵。在这个瓦片集中,每个 "单元瓦片 "的尺寸都是 64 像素乘 64 像素,因此我们可以输入这些设置,然后让 "精灵编辑器 "自动生成所需的精灵切片:

点击 "切片 "按钮后,我们就得到了一组已切片的精灵!

在 "精灵编辑器 "窗口中,每个切分的精灵都可以选择和编辑。例如,你可以为每个精灵设置名称,甚至可以手动调整位置和枢轴等值。
然后,我们需要将更改 "应用 "到 "精灵资产"(点击 "精灵编辑器 "右上角的 "应用 "按钮),这样就可以在 "项目 "窗口中单独引用每个切片精灵了:

现在,我们已经将 Sprite Sheet 分割成了单个 Sprites,接下来需要将它们 "转换 "成 Tiles。
瓷砖是 Unity 2017.2 中添加的全新资产。它的作用是保存数据,供 Tilemap 在网格上的特定单元格中使用。
基础默认瓦片资产(可通过 "项目 "窗口中的 "创建 -> 瓦片 "生成)允许为其分配一个雪碧,以及其他自定义设置,例如雪碧的色调和在瓦片贴图上使用的对撞机类型(稍后将进行说明)。

Unity 2017.2 引入了一个新窗口:瓷砖调色板!该窗口是使用新的分块贴图系统不可或缺的部分,因为它是选择使用哪些分块以及如何用它们编辑分块贴图的界面。

在将 "TopGrassTile "瓷砖添加到瓷砖调色板窗口之前,我们首先需要创建一个新的调色板。调色板可用于组织瓷砖集,而不是将所有瓷砖(可能有数百个或更多!)"存储 "到窗口中的一个工作区。

在调色板下拉菜单中,有一个创建全新调色板的选项:

将 "TopGrassTile "添加到新创建的调色板中,就像拖放一样简单!

不过,在某些情况下,我们可能需要使用成百上千的 Sprites 来构建 2D 场景。如果要为每个精灵手动创建一个 "瓦片资产",然后将每个精灵单独拖放到调色板上,将会非常耗时。
幸好有一个工作流程可以用来自动生成一组图块(每个精灵一个),并将所有图块分配到所需的调色板。拖放操作也同样简单易行!在调色板上拖动瓦片资产,而不是拖动包含切分精灵的源 Spritesheet。在这种情况下,就是 "GrassPlatform_TileSet":

现在,我们的 "GrassPlatform_TileSet "精灵表已在 "瓷砖调色板 "窗口中设置成功,是时候开始构建 2D 关卡了!
首先,我们需要在当前场景中创建一个全新的 "瓷砖贴图";这可以通过 "GameObject(游戏对象)-> 2D Objects(二维对象)-> Tilemap(瓷砖贴图)"下拉菜单完成。不过,这不仅会创建一个 "Tilemap "GameObject(包含相关组件),还会创建一个 "Grid "GameObject(Tilemap GameObject 自动成为其子对象)。
与 "Grid <-> Tilemap "设置最相似的 GameObject 结构是 Unity 的 UI 系统;在该系统中,Canvas 父 GameObject 充当其所有子 UI GameObject(如文本和图像)的布局容器。网格 "GameObject 使用 "网格 "组件来定义其所有子 Tilemap GameObject 的尺寸。有一些选项允许自定义布局:

然后,子 Tilemap GameObject 由 Tilemap 组件和 Tilemap Renderer 组件构建;前者包含绘制到其上的瓷砖数据,后者定义如何渲染的可视化设置。

瓦片贴图系统的设计使多个瓦片贴图 GameObject 可以是同一个网格的子网格,这意味着您的关卡的最终效果可以很容易地由多层不同的瓦片合成:

每个瓷砖贴图渲染器都能让你控制用于渲染瓷砖的材质、使用的分类层(这与 "雪碧渲染器"、"用户界面画布 "和 "粒子系统 "使用的层系统相同!),以及它对 "雪碧蒙版 "的反应方式。
在将瓷砖绘制到瓷砖贴图上之前,必须先选择两样东西:当前聚焦的瓷砖贴图和当前使用的画笔。
第一个选项可以从编辑选项下方的 "瓦片调色板 "窗口中的 "活动瓦片贴图 "下拉菜单中选择:

该下拉列表将显示场景中 "贴图 "组件的所有实例,您可以选择其中一个进行绘制和编辑。上面的截图只显示了一个 "Tilemap "选项,并以默认的 Tilemap GameObject 命名,而一个有多个 Tilemap 的更复杂场景可以显示这样一个可能的 Active Tilemap 列表:

在 "GrassPlatform_TileSet "示例中,重新命名 "Tilemap "GameObject 使其更准确也会更新活动 Tilemap 列表名称:

接下来要选择的是当前的刷子。瓦片资产决定了一个单元包含哪些数据(可视化、碰撞器类型等),而画笔资产则定义了如何将一个(或多个)瓦片放置到瓦片贴图上。目前,Unity 只内置了一个可供选择的画笔(名为 "默认画笔");它具有与名称相符的预期功能,如在瓦片贴图上放置、擦除、移动和填充瓦片。不过,在 Unity Technologies 团队的 GitHub 上有一个"2D Extras "资源库,其中有各种示例说明如何编写自己的自定义笔刷和瓷砖!将这些画笔导入项目后,当前画笔菜单(位于 "瓷砖调色板 "窗口底部)将允许您选择使用哪种画笔:

虽然本文没有深入探讨可脚本笔刷和可脚本瓦片的使用,但这是一个非常强大的领域,值得研究并将其整合到基于瓦片贴图的关卡设计工具集中。
设置好活动瓦片贴图和当前画笔后,我们就可以在 "瓦片调色板 "窗口中选择特定的瓦片,然后将其绘制到场景中的瓦片贴图上!您还需要确保 "编辑工具 "中的 "画笔 "图标也被选中:

成功!正在瓷砖贴图上绘制瓷砖!不过,您可能会注意到,"瓷砖 "的尺寸略小于网格单元格的尺寸。这不是一个错误,但我们需要回过头来解释一下原因,以及如何更改默认设置。
网格 "组件的 "单元格大小 "使用 Unity 的世界空间距离单位(例如,一个原始的 Unity 立方体,每个轴的默认缩放比例为 1,其大小与默认 "网格 "上一个单元格的大小相同)。每个 "雪碧 "资产的 "导入设置 "中都有一个 "单位像素 "值,默认值为 100:








