FEATURED · 精选文章

Unity 2D游戏地图制作:SuperTiled2Unity完整工作流与实战指南

发布时间 / 2026/8/4 9:36:32
来源 / 创域科博编辑部
栏目 / 资讯中心
Unity 2D游戏地图制作:SuperTiled2Unity完整工作流与实战指南 1. 项目概述为什么你需要 SuperTiled2Unity如果你正在用 Unity 开发 2D 游戏尤其是平台跳跃、RPG、策略或者俯视角动作游戏那么“地图”几乎是你绕不开的一个核心组件。自己用代码或者 Unity 的 Tilemap 手绘小规模关卡还行一旦地图尺寸变大、元素变多、需要多人协作或者频繁迭代你就会发现效率瓶颈。这时候一个专业的外部地图编辑器就显得至关重要而Tiled Map Editor正是这个领域的佼佼者。Tiled 是一款免费、开源、功能强大的 2D 地图编辑器它支持正交、等距和交错等多种地图类型图层管理清晰对象层功能灵活还能通过自定义属性为图块和对象附加各种数据。可以说用它来设计游戏关卡体验和效率都远超在 Unity 编辑器内直接摆弄。然而一个现实的问题摆在面前Tiled 生成的.tmx地图文件Unity 并不能直接识别和使用。你需要一个“桥梁”将 Tiled 地图的数据、图块、碰撞体、自定义属性乃至动画完整、准确、高效地转换到 Unity 的场景中。手动解析.tmx文件并重建所有元素那将是一场噩梦。这就是SuperTiled2Unity存在的意义。它不是一个简单的导入插件而是一个完整的、经过深度优化的 Tiled-to-Unity 工作流解决方案。我用了它好几年从个人项目到团队协作它极大地解放了美术和策划的生产力也让程序能更专注于游戏逻辑而非数据转换。这篇指南就是把我这些年积累的完整使用经验、踩过的坑和高效技巧系统地分享给你。无论你是刚接触 Tiled 的新手还是已经用过但总遇到些小问题的开发者这篇文章都能帮你把 SuperTiled2Unity 用到极致。2. 核心工作流与原理拆解在深入实操之前理解 SuperTiled2Unity后文简称 ST2U是如何工作的能让你在遇到问题时更快地定位根源也能更好地利用它的高级特性。2.1 从.tmx到 Unity 预制体发生了什么ST2U 的核心工作流程可以概括为“导入-解析-重建”。当你将一个.tmx文件拖入 Unity 的 Project 窗口或者它所在的文件夹被刷新时ST2U 的导入器就会被触发。解析与依赖收集ST2U 首先会读取.tmx文件。这个文件本质上是 XML 格式它并不包含图片数据而是记录了地图的尺寸、图层结构、图块集Tileset引用、对象信息以及各种属性。ST2U 会根据其中的路径信息找到关联的图块集文件.tsx和所有用到的精灵图通常是.png。它会将这些资源标记为依赖项。纹理切片与映射对于每一个被引用的图块集图片ST2U 会根据.tsx文件中定义的图块尺寸、间距、边距等参数自动将其切割成独立的 Sprite。这个过程相当于在 Unity 内部重建了 Tiled 中的图块集。ST2U 会为这些 Sprite 生成一个唯一的内部 ID并与 Tiled 中的图块 ID 建立精确的映射关系。场景对象重建这是最复杂的一步。ST2U 会根据地图的图层顺序在 Unity 中创建对应的 GameObject。对于图块层Tile Layer它会使用 Unity 的Tilemap组件来高效渲染。这是关键优势之一它并非生成无数个独立的 Sprite GameObject而是利用 Unity 原生的 Tilemap 系统性能要好得多。对于对象层Object Layer它会根据对象的形状矩形、椭圆、多边形、折线创建带有碰撞体如 BoxCollider2D, PolygonCollider2D的 GameObject。自定义属性注入ST2U 会读取你在 Tiled 中为图层、图块、对象设置的任何自定义属性Custom Properties。这些属性会被转换为 Unity 的Custom Property组件附加在对应的 GameObject 上你可以在运行时通过代码轻松读取从而实现诸如“这个图块是草地、泥土还是岩浆”、“这个 NPC 的对话 ID 是什么”之类的游戏逻辑。生成预制体最后ST2U 会将重建好的所有 GameObject 组织成一个结构清晰的 Prefab。这个 Prefab 的根节点是一个包含了SuperTiled2Unity.SuperMap脚本的 GameObject。这个 Prefab 就是你最终可以拖入 Scene 中使用的“地图”。注意整个导入过程是自动的但也是可配置的。你可以在 Project 设置中为.tmx文件指定一个“自定义导入器”ST2U 已经注册了自己。这意味着你无法也不应该直接修改生成的 Prefab 中的 Tilemap 渲染内容任何地图编辑都应在 Tiled 中完成然后重新导入。这是保持“单一数据源”的最佳实践。2.2 与 Unity 原生 Tilemap 的协同与差异很多人会问Unity 自己就有 Tilemap 系统为什么还要用 Tiled ST2U它们之间是什么关系你可以这样理解Tiled 是强大、专业的地图“设计工具”而 Unity Tilemap 是高效的“渲染与运行时组件”。ST2U 的巧妙之处在于它完美地将两者结合了起来。设计阶段你在 Tiled 中利用其优秀的编辑器进行地图绘制、对象摆放和属性设置。这个阶段效率极高支持笔刷、填充、随机变换等多种工具。导入阶段ST2U 将 Tiled 地图数据“编译”成 Unity 能理解的格式并选择使用 Unity 原生 Tilemap 组件作为其渲染后端。这意味着在 Unity 运行时你的地图享受的是 Unity 引擎对 Tilemap 的优化如动态合批。运行时阶段你通过 ST2U 提供的 API如SuperMap组件来访问地图数据比如根据坐标获取图块属性或者查找特定类型的对象。关键差异与优势编辑器功能Tiled 的地图编辑功能特别是大型地图管理和对象层目前比 Unity 内置的 Tilemap 编辑器更强大、更专注。数据丰富性Tiled 的对象层和自定义属性系统为游戏逻辑提供了丰富的数据支撑ST2U 将其完整保留。原生 Unity Tilemap 更侧重于渲染逻辑数据需要额外管理。跨团队协作Tiled 文件是纯文本XML和图片非常利于版本控制如 Git策划和美术可以在不打开 Unity 的情况下进行地图创作。性能ST2U 使用 Unity Tilemap 渲染因此性能与直接使用 Unity Tilemap 相当远优于导入为无数个独立 Sprite 的方案。3. 环境准备与项目配置3.1 安装 Tiled Map Editor首先你需要地图编辑器本身。前往 Tiled 的官方网站www.mapeditor.org下载对应你操作系统Windows, macOS, Linux的安装包。安装过程非常简单一路下一步即可。建议下载稳定版Stable Release。安装完成后花点时间熟悉一下 Tiled 的界面图块集面板、图层面板、属性面板和主编辑区域。你可以打开其自带的示例地图看看。3.2 在 Unity 中安装 SuperTiled2UnityST2U 可以通过 Unity 的 Package Manager 从 Git URL 直接安装这是最推荐的方式便于更新。在 Unity 中打开Window Package Manager。点击左上角的按钮选择Add package from git URL...。输入 ST2U 的 Git 仓库地址https://github.com/Seanba/SuperTiled2Unity.git点击Add。Unity 会开始下载和导入插件。等待导入完成后你会在 Project 窗口看到一个SuperTiled2Unity的文件夹。同时菜单栏会多出一项SuperTiled2Unity。验证安装点击SuperTiled2Unity Preferences...如果能打开配置窗口说明安装成功。3.3 初始项目设置与关键配置安装后有几项配置强烈建议在项目初期就设置好可以避免后续很多麻烦。设置 Pixels Per Unit (PPU) 这是 Unity 2D 项目的基石必须与你的美术资源一致。通常如果你的精灵图是 16x16、32x32 或 64x64 像素PPU 就设置为对应的数字16, 32, 64。这意味着 Unity 世界里 1 个单位对应精灵的 N 个像素。在 Project 设置中 (Edit Project Settings)找到SuperTiled2Unity分类。将Default Pixels Per Unit设置为你项目的标准 PPU。ST2U 在导入时会默认使用这个值。配置导入设置SuperTiled2Unity.asset 在SuperTiled2Unity文件夹下找到Editor子文件夹里面有一个SuperTiled2Unity.asset文件。选中它在 Inspector 窗口可以进行全局配置。Material for Tiles指定 Tilemap 使用的材质。默认是Default-Diffuse对于 2D 游戏我强烈建议你创建一个使用Sprites/DefaultShader 的材质球并在这里指定。这能确保你的 Tilemap 渲染顺序和光照正确。Object Types Xml这是一个高级功能。你可以提供一个.xml文件路径用来预定义对象类型的颜色和自定义属性。这能让 Tiled 中的对象在编辑时就有颜色标识非常直观。你可以在 ST2U 的示例中找到ObjectTypes.xml的格式。Custom Importer Properties这里可以添加一些全局的导入属性比如是否在导入时生成碰撞体、如何处理图像等。大部分情况默认即可。组织项目文件夹结构 一个清晰的结构能极大提升效率。我推荐如下结构Assets/ ├── _ThirdParty/ # 存放 SuperTiled2Unity 等插件 ├── Art/ │ ├── Tilesets/ # 存放所有 .tsx 文件和对应的 .png 图集 │ └── Sprites/ # 其他精灵 ├── Maps/ │ ├── Tiled/ # 存放原始的 .tmx 和 .tsx 文件建议 │ └── Imported/ # ST2U 导入后生成的 Prefab 和资源自动生成 └── Scripts/ └── Map/ # 地图相关的运行时脚本将.tmx和.tsx文件放在Assets/Maps/Tiled/下ST2U 会自动在Assets/Maps/Imported/下生成对应的 Prefab。这样原始文件和生成文件分离非常清晰。4. 完整工作流实操从零制作一张可交互地图现在我们从头开始制作一张包含地形、可收集物品和敌人区域的简单地图并导入 Unity 使其可交互。4.1 第一步在 Tiled 中创建地图与图块集新建地图打开 TiledFile New New Map。选择Orthogonal正交地图类型。设置地图尺寸例如 30x20 个图块图块尺寸例如 32x32必须与你的素材一致。点击保存命名为Level_01.tmx存放到你 Unity 项目的Assets/Maps/Tiled/文件夹中。创建图块集在右侧Tilesets面板点击New Tileset...。选择你的地面纹理图片例如ground_tiles.png一个包含草地、泥土、石头的图集。设置图块尺寸32x32根据需要设置间距和边距如果图集有间隔。保存为ground_tiles.tsx建议和.tmx放在同一目录或者专门的Tilesets文件夹。Tiled 会记录相对路径。绘制地形层在Layers面板默认有一个图层重命名为Ground。确保选中Ground层然后在图块集中选择草地图块使用笔刷或填充工具绘制地面。再用其他图块绘制一些泥土或石头区域。4.2 第二步添加碰撞与对象层添加碰撞层使用图块碰撞在 Tiled 中碰撞信息可以直接附加在图块上。双击ground_tiles图块集中的某个图块比如石头图块打开其属性。在属性面板点击Add Property添加一个属性名称设为unity:layer类型string值设为Ground。这是 ST2U 的专用属性告诉 Unity 将这个图块放在名为 “Ground” 的 Sorting Layer。更重要的是点击下方的Collision标签页为这个石头图块绘制一个矩形碰撞区域覆盖整个图块。这样所有被放置的该图块都会带有碰撞体。为需要碰撞的图块如墙壁、障碍物都设置好碰撞形状和unity:layer属性。创建对象层在Layers面板点击Add Layer选择Object Layer命名为Interactables。选中这个对象层从工具栏选择Insert Rectangle工具在地图上画一个矩形代表一个可收集的“金币”。选中这个矩形对象在属性面板为其添加自定义属性type(string):Collectiblevalue(int):10再插入一个多边形对象代表一个敌人的巡逻区域。为其添加属性type(string):EnemySpawnZoneenemyType(string):SlimepatrolPoints(string):0,0; 5,0; 5,3; 0,3(用分号分隔的坐标列表)4.3 第三步在 Unity 中导入与基础设置首次导入确保你的 Unity 项目窗口焦点在Assets/Maps/Tiled/文件夹。当你保存Level_01.tmx后Unity 会自动检测到变化并触发 ST2U 导入。你会在 Console 窗口看到导入日志。导入完成后在Assets/Maps/Imported/或你配置的对应输出目录下会生成Level_01.prefab。检查导入结果将Level_01.prefab拖入场景。你会看到一个结构清晰的 GameObject。展开它你会看到以图层命名的子物体Ground(Tilemap)Interactables(空物体其下是代表金币和敌人区域的子物体)。选中Ground查看其 Inspector。它包含Tilemap、TilemapRenderer和CompositeCollider2D因为我们在 Tiled 中为图块设置了碰撞。这正是 ST2U 将图块碰撞转换为 Unity 碰撞体的结果。选中Interactables下的金币矩形对象你会看到它有一个BoxCollider2D因为它是矩形对象以及一个SuperCustomProperties组件里面列出了我们在 Tiled 中设置的type和value属性。4.4 第四步编写脚本与地图交互现在我们需要写一些 C# 脚本来利用导入的地图数据。读取自定义属性 创建一个脚本MapInteractionManager.cs挂载到场景中或某个管理器上。using UnityEngine; using SuperTiled2Unity; // 引入 ST2U 命名空间 public class MapInteractionManager : MonoBehaviour { public SuperMap superMap; // 拖入场景中的 SuperMap 组件 void Start() { if (superMap null) return; // 方法一通过 SuperObject 组件获取特定对象 var interactableObjects superMap.GetComponentsInChildrenSuperObject(); foreach (var obj in interactableObjects) { // 读取我们在 Tiled 中设置的“type”属性 if (obj.TryGetCustomProperty(type, out CustomProperty typeProp)) { string objType typeProp.GetValueAsString(); Debug.Log($Found object: {obj.name}, Type: {objType}); if (objType Collectible) { SetupCollectible(obj); } else if (objType EnemySpawnZone) { SetupEnemyZone(obj); } } } // 方法二通过坐标获取图块属性例如判断玩家站在什么类型的图块上 // 这需要更复杂的逻辑通常结合 Grid 和 Tilemap 组件 } void SetupCollectible(SuperObject collectibleObj) { // 为金币添加一个触发器并设置逻辑 var collider collectibleObj.GetComponentBoxCollider2D(); if (collider ! null) collider.isTrigger true; // 添加一个简单的视觉表现例如一个精灵渲染器 var sr collectibleObj.gameObject.AddComponentSpriteRenderer(); sr.sprite Resources.LoadSprite(coin); // 加载金币精灵 sr.sortingLayerName Items; // 读取金币价值 if (collectibleObj.TryGetCustomProperty(value, out CustomProperty valueProp)) { int coinValue valueProp.GetValueAsInt(); // 可以将这个值存储在一个自定义脚本上用于得分逻辑 var coinScript collectibleObj.gameObject.AddComponentCoin(); coinScript.value coinValue; } } void SetupEnemySpawnZone(SuperObject zoneObj) { // 读取敌人类型和巡逻点 if (zoneObj.TryGetCustomProperty(enemyType, out CustomProperty enemyTypeProp) zoneObj.TryGetCustomProperty(patrolPoints, out CustomProperty pointsProp)) { string enemyPrefabName enemyTypeProp.GetValueAsString(); string pointsStr pointsProp.GetValueAsString(); // 解析巡逻点字符串 0,0; 5,0; 5,3; 0,3 var pointStrings pointsStr.Split(;); Vector2[] patrolPoints new Vector2[pointStrings.Length]; for (int i 0; i pointStrings.Length; i) { var coords pointStrings[i].Trim().Split(,); float x float.Parse(coords[0]); float y float.Parse(coords[1]); // 注意Tiled 对象的位置是左下角为原点可能需要根据你的坐标系转换 patrolPoints[i] new Vector2(x, y) (Vector2)zoneObj.transform.position; } // 根据 enemyPrefabName 加载并实例化敌人并设置其巡逻点 Debug.Log($Spawning {enemyPrefabName} with {patrolPoints.Length} patrol points.); // ... 实例化敌人并传递 patrolPoints 的逻辑 ... } } }处理图块碰撞 对于在 Tiled 中设置了碰撞的图块如我们的石头ST2U 已经生成了CompositeCollider2D。你只需要确保你的玩家角色带有Rigidbody2D和Collider2D并设置好物理图层Layer的碰撞矩阵物理引擎就会自动处理碰撞。4.5 第五步优化与高级技巧使用 Object Types Xml 进行可视化区分 在 Tiled 安装目录或 ST2U 的示例中找到一个ObjectTypes.xml的示例。复制到你的项目例如Assets/Editor/。内容如下?xml version1.0 encodingUTF-8? objecttypes objecttype nameCollectible color#ffcc00/ objecttype nameEnemySpawnZone color#ff0000/ objecttype namePlayerSpawn color#00ff00/ /objecttype在 Unity 的SuperTiled2Unity.asset配置中指定这个文件的路径。然后回到 Tiled打开View Show Object Types。现在当你在对象属性中选择type为Collectible时该对象在 Tiled 中会显示为金黄色EnemySpawnZone显示为红色一目了然极大提升设计体验。自定义导入器与后处理 如果你需要在导入过程中执行更复杂的逻辑比如根据自定义属性自动添加特定的 Unity 组件可以编写自定义的导入后处理器。创建一个继承自SuperTiled2Unity.SuperImporter的类重写InternalOnImportAsset方法在其中遍历导入的对象并进行修改。这属于高级用法可以让你实现“数据驱动”的实体组装。处理大型地图与分块加载 Tiled 支持创建非常大的地图。ST2U 在导入时会生成一个完整的 Prefab。对于超大型地图直接全部加载可能影响性能。常见的策略是在 Tiled 中分块设计将大地图分成多个小的.tmx文件。在 Unity 中动态加载编写一个管理器根据玩家位置异步加载和卸载对应的地图 Prefab。ST2U 导入的每个 Prefab 都是独立的非常适合这种动态加载模式。5. 常见问题排查与性能优化即使流程正确实践中也难免遇到问题。这里记录了一些高频问题和解决方案。5.1 导入失败与资源丢失问题现象可能原因解决方案导入后 Prefab 为粉色丢失材质未在SuperTiled2Unity.asset中正确指定 Tilemap 材质。创建一个使用Sprites/DefaultShader 的材质球并在全局设置中指定。图块显示为纯色方块图块集图片的纹理类型Texture Type不是Sprite (2D and UI)。在 Project 窗口选中图集图片在 Inspector 中将 Texture Type 改为Sprite (2D and UI)并应用。Sprite Mode 根据情况选择Multiple如果被 ST2U 切割或Single。控制台报错“Could not find tileset...”.tmx文件中引用的.tsx文件路径错误或丢失。确保.tsx文件与.tmx文件在 Unity 项目内的相对路径与在 Tiled 中编辑时的一致。最好将它们放在同一个 Unity 资源文件夹下。碰撞体位置或形状不对Tiled 中的碰撞形状绘制有误或 Unity 中 PPU 设置不匹配。1. 在 Tiled 中仔细检查图块或对象的碰撞轮廓。2. 确保 Unity 项目的 PPU 与 Tiled 中图块的像素尺寸一致。5.2 运行时问题问题现象可能原因解决方案自定义属性读取为null属性名拼写错误或对象上没有该属性。使用TryGetCustomProperty方法安全读取。在 Tiled 中双击对象确认属性名称和大小写。对象层中的物体没有碰撞体在 Tiled 中创建对象时未设置其形状如矩形、多边形或者 ST2U 导入设置中关闭了碰撞体生成。1. 在 Tiled 中确保对象有具体的形状。2. 检查SuperTiled2Unity.asset中Collision相关设置。Tilemap 渲染顺序错乱Sorting Layer 或 Order in Layer 设置冲突。1. 在 Tiled 中通过unity:sortingLayerName和unity:sortingOrder自定义属性为图层或图块设置渲染顺序。2. 在 Unity 中检查TilemapRenderer组件的设置。5.3 性能优化要点善用 TilemapST2U 将图块层导入为 Unity Tilemap这本身已是性能最佳实践。确保你的 Tilemap 使用的是合适的材质如Sprites/Default并启用TilemapRenderer的合批选项。简化碰撞体对于由大量小图块组成的复杂地形ST2U 生成的CompositeCollider2D可能会很复杂。在保证游戏性的前提下可以考虑在 Tiled 中用更简单的碰撞形状如矩形来近似复杂地形。在 Unity 中调整CompositeCollider2D的Geometry Type为Polygons并增大Edge Radius或使用Outlines来简化几何形状。对象层优化对象层中的每个对象在 Unity 中都是一个独立的 GameObject。如果数量巨大如成千上万的草叶会严重影响性能。对于这类装饰性物体应考虑使用 Tilemap 的动画图块功能来实现。或者在 Tiled 中放置但通过自定义属性标记在运行时由脚本按需实例化或使用对象池。图块集纹理优化将多个小图块合并到一张大图集Texture Atlas中这是标准做法。确保图集尺寸符合 POT2的幂次方规范并设置合适的压缩格式以减少内存占用和提升渲染效率。6. 进阶应用动画图块与自定义解析6.1 使用 Tiled 的动画图块Tiled 支持定义动画图块一个图块对应一系列帧动画。ST2U 完美支持这一特性。在 Tiled 中创建动画图块在图块集编辑器中选中一个图块在属性面板找到Animation部分。点击添加帧指定帧图块和持续时间毫秒。例如创建一个闪烁的火把动画包含 3 帧每帧 200ms。导入到 Unity无需特殊设置。ST2U 会自动识别动画图块并在生成的 Tilemap 中为该位置对应的 Tile 创建一个TileAnimationData。Unity 的 Tilemap 系统会自动播放这个动画。注意事项动画的播放受 Unity 场景运行控制。确保你的 Tilemap 所在的 GameObject 是激活的并且场景在运行状态。6.2 扩展自定义属性与脚本联动自定义属性是 Tiled 和 Unity 联动的灵魂。除了简单的字符串、整数、布尔值你还可以发挥更多创意。枚举类型虽然 Tiled 属性没有直接的枚举类型但你可以用字符串属性来模拟。在 Unity 脚本中使用System.Enum.Parse或switch语句将其转换为枚举值。// Tiled 中设置属性: weaponType Sword if (obj.TryGetCustomProperty(weaponType, out CustomProperty weaponProp)) { string weaponStr weaponProp.GetValueAsString(); WeaponType type (WeaponType)System.Enum.Parse(typeof(WeaponType), weaponStr); // 使用枚举 type }引用其他资产你可以用字符串属性存储一个 Prefab 或 ScriptableObject 的路径然后在 Unity 中通过Resources.Load或AssetDatabase.LoadAssetAtPath仅编辑器进行加载和实例化。复杂数据JSON对于需要多个字段的结构化数据可以在 Tiled 中用一个字符串属性存储 JSON 文本。在 Unity 中使用JsonUtility.FromJson来解析。这非常强大可以用于定义复杂的对话、任务或敌人行为数据。6.3 处理等距Isometric地图ST2U 同样支持 Tiled 的等距地图。关键设置在于导入时的PPU和网格方向。在 Tiled 中创建地图时选择Isometric类型。图块需要是菱形的等角投影素材。在 Unity 中PPU 的设置需要计算。通常如果你的等距图块素材高度是 H 像素那么 PPU 可以设置为H / (sin(45°) * 2)的近似值。一个常见的经验值是对于 64x32 的经典等距图块PPU 设为 64。更简单的方法是在SuperTiled2Unity.asset的导入设置中找到针对该地图的覆盖选项或使用每个.tmx文件的自定义导入器设置将Orientation设置为Isometric。ST2U 会根据这个设置自动调整网格和渲染。Unity 的 Tilemap 在Grid组件中可以选择Isometric布局ST2U 在导入等距地图时会自动配置好这些。掌握这些核心流程、问题解决方法和进阶技巧后Tiled 加 SuperTiled2Unity 的组合将成为你 2D 游戏开发流程中不可或缺的高效生产线。它真正实现了“专业工具做专业事”让关卡设计从繁琐的技术细节中解放出来回归到创意和玩法的核心。
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻