公司动态
Unity Tilemap全攻略:从零构建2D平台跳跃游戏关卡
1. 项目概述与核心价值最近在社区里看到不少朋友对2D平台跳跃游戏开发感兴趣尤其是想复刻《超级马里奥》那种经典关卡的感觉。但很多人卡在了关卡搭建这一步要么是美术资源不会处理要么是手动摆放精灵效率太低一个简单的关卡就要花上大半天。其实Unity早就为我们准备好了“神器”——Tilemap瓦片地图系统。它就像游戏世界的“乐高积木”能让你用预设好的“瓦片”快速拼出复杂、规整的关卡地形。这个项目我们就来彻底搞懂如何用Unity的Tilemap从零开始搭建一个充满马里奥风格的2D关卡。我会带你走完从导入资源、配置瓦片调色板、绘制地形、添加碰撞到最终优化和打包的完整流程。更重要的是我会附上一个我整理好的、可直接使用的完整资源包里面包含了马里奥风格的地面、砖块、水管、问号方块等经典元素以及一些常见的坑点和解决方案。无论你是刚接触Unity的新手还是想系统学习2D关卡设计的老手这篇内容都能让你少走弯路快速上手。2. Tilemap系统深度解析与准备工作2.1 为什么是Tilemap传统方式的瓶颈在Tilemap出现之前搭建2D关卡主要有两种方式一是使用单个Sprite精灵作为背景图这种方式灵活但难以实现精确的碰撞和交互二是将每个地形元素如一块砖都做成一个独立的GameObject游戏对象然后手动在场景中排列。第二种方式在制作《超级马里奥》这类由大量重复小单元16x16或32x32像素的砖块构成的关卡时简直是噩梦。每一个GameObject都会占用性能开销场景层级视图会变得极其臃肿修改起来更是困难重重。Tilemap的核心思想是“网格化”和“数据驱动”。它将整个关卡视为一个巨大的网格每个网格单元Cell可以放置一块“瓦片”Tile。这些瓦片本质上是一种特殊的资产包含了精灵图像和可选的属性如碰撞体类型。Tilemap系统在渲染时会将相邻且相同的瓦片进行合批处理极大地提升了渲染效率。在场景管理上一个Tilemap组件就管理了成千上万个瓦片单元层级清晰编辑体验流畅。对于平台跳跃游戏Tilemap能完美地解决地形拼接、碰撞体生成和快速迭代的问题。2.2 资源包的选择、导入与避坑指南工欲善其事必先利其器。一个风格统一、元素齐全的资源包是高效开发的基础。网络上有很多免费的像素艺术资源但质量参差不齐。为了这次教程我特意准备了一个**“Mario-Style Tilemap Resource Pack”**它包含了以下几个关键部分并针对Unity的Tilemap系统做了优化基础地形瓦片集包含草地、泥土、砖块、水管顶部/侧面、城堡砖等经典元素的精灵图所有图片尺寸统一为32x32像素并已正确切割Sprite Mode: Multiple, Pixels Per Unit: 32。可交互物件问号方块、实心砖块、金币、隐藏砖块的动画精灵序列。装饰元素云朵、灌木丛、小山等背景装饰。预制体与示例场景包含玩家控制器、敌人栗子仔基础逻辑、金币收集等预制体以及一个搭建好的示例关卡供参考。注意导入资源包是第一个大坑。很多新手会直接下载一个.zip文件然后尝试用Unity的Assets - Import Package - Custom Package...来导入这常常会导致失败并出现类似“invalid zip archive: could not find eocd”或“invalid info.yml”的错误。这通常是因为资源包本身不是Unity专用的.unitypackage格式或者压缩包在下载过程中损坏。正确的导入姿势如下获取.unitypackage文件确保你下载的是以.unitypackage为后缀的文件。如果是其他格式的压缩包你需要先解压然后将整个文件夹拖入Unity项目的Assets目录下。在Unity中导入对于.unitypackage文件在Unity编辑器中直接双击它或者在菜单选择Assets - Import Package - Custom Package...然后找到该文件。处理文件夹拖入如果是解压后的文件夹直接将其从系统文件管理器拖拽到Unity的Project窗口的Assets文件夹内即可。Unity会自动识别其中的图片、预制体等资源。如果导入后出现精灵切割错误所有图片堆在一张图上你需要选中这些图片在Inspector面板中将Sprite Mode从Single改为Multiple然后点击Sprite Editor使用Slice功能通常选择Grid By Cell Size并输入正确的像素尺寸如32x32进行自动切割。2.3 核心工具2D Tilemap Editor与Extras包Unity默认就包含了基础的Tilemap功能。在Unity中通过Window - 2D - Tilemap Palette可以打开瓦片调色板窗口这是我们绘制关卡的主要工具。通过GameObject - 2D Object - Tilemap可以创建Tilemap游戏对象。但对于制作复杂的平台游戏我强烈建议安装官方提供的2D Extras资源包。它包含了许多高级瓦片类型能极大提升开发效率。安装2D Extras打开Window - Package Manager。确保顶部下拉菜单选择的是Unity Registry。在搜索框中输入“2D Tilemap Extras”。找到后点击Install。安装完成后你可以在Assets下创建新的瓦片时看到更多选项如Animated Tile动画瓦片、Rule Tile规则瓦片等。Rule Tile规则瓦片是本次项目的核心。它允许你定义一套规则让一个瓦片根据其上下左右邻居的不同自动变换为合适的精灵。例如一块“草地”瓦片当它上方是空气时显示为草皮表面当它上方有其他草地时则显示为泥土侧面。这避免了手动为每一种连接情况绘制不同瓦片的繁琐工作是实现马里奥风格无缝拼接地形的关键。3. 构建马里奥风格关卡的全流程实操3.1 创建与配置Tilemap及网格首先我们创建一个干净的2D场景File - New Scene。然后创建Tilemap对象。创建基础TilemapGameObject - 2D Object - Tilemap - Rectangular。这会在场景中创建一个带有Grid父物体和Tilemap子物体的结构。理解层级结构Grid控制整个瓦片地图的网格对齐、单元格大小默认为1x1 Unity单位。我们通常保持默认因为我们的精灵PPU是321单位对应32像素这很合适。Tilemap附着Tilemap和Tilemap Renderer组件负责存储和渲染瓦片。为不同图层创建多个Tilemap经典的2D游戏通常有背景层、地形层可碰撞、前景装饰层。我们可以创建多个Tilemap来实现。在Grid物体上右键选择2D Object - Tilemap创建一个新的子Tilemap。将其重命名为“Ground”。再创建一个重命名为“Background”。选中Background这个Tilemap在Inspector中找到Tilemap Renderer组件将其Order in Layer设置为一个较小的负数如-1这样它就会渲染在Ground的后面。你还可以为Ground添加Tilemap Collider 2D组件并勾选其上的Used By Composite然后点击Add Component添加一个Composite Collider 2D。这样所有Ground上的瓦片会自动合并成一个优化过的碰撞体性能远优于为每个瓦片单独添加碰撞体。3.2 制作核心瓦片Rule Tile的应用现在我们来制作马里奥关卡中最常见的地面——草地泥土块。创建Rule Tile资产在Project窗口的Assets文件夹内右键Create - 2D - Tiles - Rule Tile。将其命名为“Grass_Dirt_RuleTile”。配置Rule Tile选中新创建的Rule TileInspector面板会显示其配置界面。Default Sprite拖入一个默认的泥土侧面精灵。Tiling Rules点击下方的号添加规则。这是最关键的一步。定义“顶部草地”规则我们希望当瓦片上方没有邻居即空气时显示为带有草皮的顶部。在Rule区域你会看到一个3x3的网格中心代表当前瓦片。点击中心上方的格子将其规则设置为Dont Care不关心不我们需要它上方没有瓦片。所以应该设置为This当前瓦片类型不对。我们需要设置一个“邻居条件”。实际上对于“上方是空气”这个条件我们需要将中心上方格子的规则设置为Empty空的。然后将Output下的Sprite拖入草皮顶部的精灵图。可选勾选Random Output下的Noise可以给这个规则的输出添加一点随机变化让草地看起来更自然。定义“内部泥土”规则我们希望当瓦片上下左右都有邻居时显示为纯粹的泥土块。添加新规则。在3x3网格中将中心格子的上、下、左、右四个方向的规则都设置为This表示这些方向必须有同类型的瓦片。将Output的Sprite拖入一个纯泥土的精灵。定义其他规则同理你可以定义“左侧边缘”、“右侧边缘”、“底部边缘”、“左上角”、“右上角”等规则。2D Extras包中的Rule Tile提供了强大的可视化规则配置你可以通过勾选GameObject选项甚至为不同规则指定生成不同的预制体比如在砖块被顶的位置生成金币特效。制作好Grass_Dirt_RuleTile后用同样的方法制作Brick_RuleTile砖块、Pipe_RuleTile水管需要单独制作顶部和侧面规则等。3.3 使用调色板绘制关卡地形瓦片制作好后我们需要把它们放到调色板Palette中才能绘制。创建新调色板打开Tilemap Palette窗口Window - 2D - Tilemap Palette。点击Create New Palette命名为“MarioLevel”保存到Assets下的合适文件夹。填充调色板直接从Project窗口将制作好的Grass_Dirt_RuleTile、Brick_RuleTile等瓦片资产拖拽到Tilemap Palette窗口的网格中。开始绘制在Tilemap Palette窗口中选中Grass_Dirt_RuleTile。在Scene视图或Tilemap窗口Window - 2D - Tilemap中确保选中的是Ground这个Tilemap图层。现在你就可以像用画笔一样在网格上点击或拖动来绘制地面了。Rule Tile会自动根据你绘制的形状为每个瓦片选择符合规则的精灵瞬间就能铺出一条边缘整齐的草地平台。绘制技巧大面积填充使用调色板窗口的Rectangle工具可以快速绘制矩形区域。擦除使用Pick工具或Erase工具。绘制水管水管通常由顶部和侧面组成。先绘制水管顶部一个独立的瓦片然后在正下方连续绘制水管侧面瓦片。可以创建一个Pipe的父空物体将水管的顶部和侧面Tilemap都放在其下方便整体移动和管理。绘制问号方块问号方块是动画瓦片。你需要创建一个Animated Tile资产将问号闪烁的几张精灵序列拖进去设置好帧率如0.2秒每帧然后将其放入调色板进行绘制。3.4 碰撞体、排序层与场景优化地形画好了但玩家还无法站在上面因为还没有碰撞体。为地形层添加碰撞如前所述选中GroundTilemap添加Tilemap Collider 2D和Composite Collider 2D。Composite Collider 2D会自动将无数个小碰撞体合并成几个大的凸包形状大幅提升物理性能。记得将Tilemap Collider 2D的Used By Composite勾选上。调整碰撞体材质为了获得马里奥那种略带“粘滞感”的平台跳跃体验可以创建一个Physics Material 2D将其Friction摩擦力调高如0.8Bounciness弹性调低如0.1然后赋给Composite Collider 2D。排序层Order in Layer管理确保背景、地面、前景装饰、玩家、敌人等元素正确排序。玩家和敌人的Sprite Renderer的Order in Layer可以设置为0。地面Ground的Tilemap Renderer的Order in Layer设置为0与玩家同层但通过位置决定前后。背景Background的设置为-1。前景装饰如最前面的草丛可以设置为1。更复杂的管理可以使用Sorting Layers排序层在Tags Layers设置中创建如“Background”, “Ground”, “Player”, “Foreground”等层然后为每个渲染器指定不同的Sorting Layer再辅以Order in Layer进行微调。优化绘制调用在Tilemap Renderer组件上Mode默认是Individual个体对于静态地形可以改为Chunk块Unity会尝试将相邻瓦片合并成更大的网格进行绘制减少Draw Call。4. 高级技巧与资源包深度使用4.1 动画瓦片与可交互元素实现静态关卡有了我们还需要那些“活”起来的元素。动画瓦片Animated Tile问号方块创建Animated Tile资产在m_AnimatedSprites数组里按顺序拖入问号旋转的精灵图。m_MinSpeed和m_MaxSpeed设置动画播放速度区间例如都设为5表示每秒5帧。m_StartTime可以设置随机起始时间让多个问号方块动画不同步看起来更自然。将其放入调色板像普通瓦片一样绘制到场景中。闪烁的金币同样使用Animated Tile放入金币旋转的精灵序列。可破坏砖块这需要一点简单的脚本逻辑。我们不能直接用瓦片因为瓦片本身不包含逻辑。通常的做法是创建一个“DestructibleBrick”预制体包含一个Sprite Renderer显示砖块精灵和一个Box Collider 2D。编写一个脚本DestructibleBrick.cs挂载在上面。脚本里监听玩家的碰撞比如玩家从下方撞击当条件满足时播放一个破碎动画或直接销毁预制体并可能生成一个金币预制体。在关卡中这些可破坏砖块作为预制体实例放置而不是Tilemap瓦片。但它们的位置需要与Tilemap网格对齐以保持关卡的整体感。隐藏砖块逻辑与可破坏砖块类似但初始时Sprite Renderer的enabled为false不可见只有玩家从下方顶到特定位置时才设置为true并播放出现动画。4.2 使用资源包中的预制体加速开发我提供的资源包中包含了一些已经写好的基础预制体你可以直接拖入场景使用玩家控制器PlayerController一个基础的马里奥风格移动脚本包含奔跑、跳跃、蹲滑如果精灵支持的输入处理以及与Tilemap碰撞体的交互。你需要将场景中的Ground图层赋值给它的Ground Layer Mask。栗子仔Goomba敌人一个简单的左右巡逻AI碰到墙壁或悬崖会转身。包含被玩家踩踏后的动画和销毁逻辑。金币Coin带有旋转动画和触发碰撞体的预制体。当玩家碰到时播放收集音效和粒子特效然后销毁自身同时通知游戏管理器增加分数。旗杆与终点一个组合预制体包含旗杆的Tilemap拼接和顶部的终点旗帜一个带有简单动画的Sprite。使用这些预制体你可以快速搭建出一个可玩的关卡原型。重点是理解它们与Tilemap地形的交互方式尤其是碰撞层的设置。4.3 关卡设计与布局心得有了工具如何设计一个有趣的关卡从简单开始先搭建一个平坦的起点区域让玩家熟悉操作。引入基础挑战设置一个需要助跑跳过的缺口或者一个需要顶的砖块里面放金币。组合元素将跳跃缺口、移动平台可以用非Tilemap的移动物体实现、低矮水管需要蹲下通过组合在一起。设置节奏在连续挑战后给一个安全的“休息区”可能藏着奖励。引导玩家利用金币的排布、敌人的走向、地形的走势无形中引导玩家走向正确的道路。例如一排金币往往暗示着一条可行的跳跃路径。视觉层次利用背景层和前景层增加关卡的纵深感和丰富度。远处的山和云移动慢视差滚动近处的灌木丛移动快。在Unity中你可以使用空物体作为“关卡段”的父节点将一整段地形、敌人、机关打包管理方便复制、移动和测试。5. 常见问题、性能优化与打包发布5.1 开发过程中的典型问题排查即使按照步骤操作你也可能会遇到一些问题。这里记录了几个我踩过的坑和解决方案瓦片绘制不上或显示粉色原因最常见的原因是瓦片资产Rule Tile/Animated Tile引用的精灵图片丢失或未正确导入。解决检查该瓦片资产的Inspector确保Default Sprite或规则中的Sprite字段不为空或没有感叹号。检查对应的精灵图片的Texture Type是否为Sprite (2D and UI)并且Sprite Mode设置正确单张用Single图集用Multiple并切割好。碰撞体不生效或形状奇怪原因Tilemap Collider 2D没有和Composite Collider 2D正确配合或者瓦片本身的碰撞体形状设置有问题。解决首先确保Tilemap Collider 2D上勾选了Used By Composite。其次检查Composite Collider 2D的Geometry Type对于平台游戏Polygons通常比Outlines更精确。如果碰撞体形状有毛刺可以调整Tilemap Collider 2D的Maximum Tile数量影响合并精度或在导入精灵时在Sprite Editor中手动编辑其物理形状Physics Shape使其更贴合像素图形。动画瓦片不播放原因场景未运行或者Animated Tile的播放速度设置为0。解决动画瓦片在编辑模式下默认是不播放的需要进入Play模式测试。检查Animated Tile资产中的Min Speed和Max Speed确保大于0。导入资源包后Unity编辑器卡顿或无响应原因可能导入了大量未压缩的高分辨率图片或者脚本编译错误。解决检查导入的图片将不需要超大尺寸的图片的Max Size调低如1024Format改为Compressed。查看Console窗口是否有编译错误优先解决。如果问题依旧尝试分批导入资源或重启Unity。5.2 性能优化要点当关卡变得很大时需要注意性能。Tilemap Renderer设置如前所述将Mode改为Chunk。对于完全静态的背景层可以勾选Chunk模式下的Static选项并考虑将其烘焙Bake到静态合批中在Tilemap Renderer组件右上角点击Static下拉框勾选Contribute GI和Occluder Static等但2D游戏通常不需要GI。碰撞体优化务必使用Composite Collider 2D。对于不会移动的Tilemap将其Rigidbody 2D的Body Type设置为Static。剔除CullingUnity的摄像机默认会渲染所有东西。对于大型关卡可以考虑使用Cinemachine虚拟摄像机或者编写简单的脚本根据玩家位置动态禁用远处Tilemap的渲染器GetComponentTilemapRenderer().enabled false但这需要精心设计关卡区块。精灵图集Sprite AtlasUnity会自动为使用相同材质的精灵生成图集以减少Draw Call。确保你的瓦片精灵都使用相同的材质通常是默认的Sprites-Default。你可以通过Window - 2D - Sprite Atlas窗口创建和配置自定义的Sprite Atlas将关卡所有精灵打包进一步控制合批。5.3 项目构建与资源管理关卡制作完成最后一步是打包发布。构建设置Build Settings将你的主场景拖入Scenes In Build列表。选择目标平台如PC, Mac Linux Standalone, 或Android/iOS。处理资源依赖确保所有用到的资源精灵、预制体、脚本、音效都在Assets文件夹下的某个目录中不要引用项目外部的文件。Addressables资源管理系统可选但推荐对于大型项目考虑使用Unity的Addressables系统来管理资源。它可以实现资源的热更新、按需加载避免所有资源打包进一个巨大的初始包。当你遇到“打包后TMP材质紫了”或类似问题往往是因为动态加载的资源其材质引用丢失。Addressables能很好地管理这种依赖关系。构建与测试点击Build选择一个输出文件夹。构建完成后务必运行生成的可执行文件进行完整测试检查所有关卡元素、碰撞、音效、UI是否都正常工作。从一张白纸到一个充满经典韵味的可玩关卡Tilemap系统极大地解放了我们的生产力。它不仅仅是工具更是一种设计思维——用模块化的、数据驱动的方式来构建游戏世界。我提供的资源包是一个起点希望你能在此基础上发挥创意调整规则制作出属于自己的、独一无二的2D平台关卡。记住好的关卡设计在于节奏、挑战和奖励的平衡多玩、多分析经典作品然后动手在Unity里把它实现出来这个过程本身就是最大的乐趣。如果在实现过程中遇到任何上面没覆盖到的问题不妨回头检查一下每个步骤的细节或者拆解一下资源包里的示例场景大多数答案都在里面。