关于 unity-tilemap-2d
面向 Unity 6.3 LTS 项目的开发者,介绍使用 Grid 和 Tilemap 绘制、碰撞与脚本编辑 2D 地图的方法,并覆盖 Rule Tiles 等工作流。
主要功能
- 01创建 Grid 与分层 Tilemap
- 02使用 Tile Palette 绘制地图
- 03配置 Tilemap 碰撞体
- 04通过 Rule Tiles 自动铺砖
- 05脚本运行时编辑与批量填充
适用场景
- 01搭建带背景、地面和前景的 2D 关卡
- 02为地图实体层添加合并碰撞体
- 03用脚本生成房间或地板区域
- 04在运行时更新地图单元格
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ gamedev-skills/ awesome-gamedev-agent-skills --skill unity-tilemap-2d安装后在 Claude Code 中输入/unity-tilemap-2d确认已加载。
详细介绍
Unity 2D Tilemap
在 Unity 6.3 LTS 中使用 Grid/Tilemap 系统、Tile Palette、碰撞体和运行时绘制来创建和编写基于图块的 2D 关卡脚本。目标版本为 Unity 6.3 LTS (6000.3)。
**包说明:**核心 Tilemap(
Grid、Tilemap、Tile、TilemapCollider2D)是内置的。Rule Tiles、Animated Tiles 和 Tile Palette 画笔属于独立的 “2D Tilemap Extras”包(com.unity.2d.tilemap.extras)——使用RuleTile前,请通过 Package Manager 安装该包。
适用场景
- 需要通过绘制图块来布置 2D 关卡、设置
Grid+Tilemap、为地图添加碰撞、使用自动拼接的 Rule Tiles,或通过脚本生成/编辑图块时使用。 - 场景包含带有
Tilemap子对象的Grid,或*.asset图块/调色板文件时使用。
**不适用场景:**关卡_设计_实践(节奏、白盒搭建、布局原则)→
level-design。3D 图块/网格摆放 → 使用 Unity 自带的 3D 工具(ProBuilder/网格画笔;此处没有专用技能)。移动于图块之上的平台游戏角色 →
platformer / unity-physics。
核心工作流
- **创建网格:**GameObject → 2D Object → Tilemap → Rectangular(
Grid的 Cell Layout 还提供 Hexagonal 和 Isometric 布局,适用于六边形/等距视角关卡)。这会创建一个带有Tilemap子对象(及TilemapRenderer)的Grid。每个图层(背景、地面、前景)使用一个 Tilemap,并设置各渲染器的排序。 - 打开 Tile Palette(Window → 2D → Tile Palette),拖入切片后的精灵图集以创建
Tile资源,然后使用画笔工具绘制。 - **为实心图层添加碰撞:**添加
TilemapCollider2D。如需使用一个合并后的碰撞体(性能开销低得多且没有缝隙),还要添加CompositeCollider2D(及一个设为 Static 的Rigidbody2D),并在 Tilemap 碰撞体上启用 Used By Composite。 - 使用 Rule Tiles 自动拼接(2D Tilemap Extras),自动为边缘/角落选择合适的精灵,而不必手动放置每种变体。
- 通过脚本在运行时编辑,使用单元格坐标(
Vector3Int):调用SetTile、GetTile、SetTilesBlock,并使用Grid/Tilemap转换世界坐标↔单元格坐标。 - **验证:**在 Play 模式下确认碰撞(Physics Debugger)、排序顺序,以及批量编辑后是否运行了
RefreshAllTiles。
模式
1. 在运行时绘制图块(单元格坐标)
using UnityEngine;
using UnityEngine.Tilemaps;
public class TilePainter : MonoBehaviour
{
[SerializeField] private Tilemap tilemap; // assign the target Tilemap
[SerializeField] private TileBase groundTile;
// World position -> cell, then place a tile.
public void PaintAt(Vector3 worldPos)
{
Vector3Int cell = tilemap.WorldToCell(worldPos);
tilemap.SetTile(cell, groundTile);
}
public bool IsSolid(Vector3 worldPos)
=> tilemap.GetTile(tilemap.WorldToCell(worldPos)) != null;
}
2. 批量填充区域(比逐格调用 SetTile 更快)
// SetTilesBlock writes a whole BoundsInt in one call — use it for procedural rooms/floors.
public void FillFloor(Tilemap map, TileBase tile, int width, int height)
{
var bounds = new BoundsInt(0, 0, 0, width, height, 1);
var tiles = new TileBase[width * height];
for (int i = 0; i < tiles.Length; i++) tiles[i] = tile;
map.SetTilesBlock(bounds, tiles);
}
3. 清除和刷新
tilemap.SetTile(cell, null); // null erases the tile at that cell
tilemap.RefreshTile(cell); // re-evaluate just this cell's rule/animated neighbors (cheap)
// RefreshAllTiles() re-evaluates the ENTIRE map — reserve it for full regenerations, not per-edit.
常见问题
- 找不到
RuleTile类型——它不是内置功能。请通过 Package Manager 安装 2D Tilemap Extras 包(com.unity.2d.tilemap.extras)。 - 每个图块都使用一个碰撞体,导致性能下降/留下缝隙——添加
CompositeCollider2D和静态Rigidbody2D,并启用 Used By Composite,将整个图层合并为一个平滑的形状。 - 混淆世界坐标和单元格坐标——
SetTile/GetTile接受的是Vector3Int单元格,而不是世界坐标。务必使用WorldToCell/CellToWorld进行转换。 - 图块意外地显示在精灵后方/前方——设置各
TilemapRenderer的 Sorting Layer 和 Order in Layer;多个 Tilemap 需要明确设置排序顺序。 - 脚本编辑后 Rule Tiles/动画图块没有更新——写入后进行刷新;但少量编辑时优先使用指定的
RefreshTile(cell)。RefreshAllTiles()会重新评估地图上的每个图块,并使大型关卡卡顿。仅在重新生成整张地图时使用完整刷新。 - 绘制到错误的图层——Tile Palette 中的活动目标 Tilemap 决定图块绘制位置;请检查“Active Tilemap”下拉菜单。
参考资料
- 主要文档:Unity 手册中的“Tilemaps”
(
https://docs.unity3d.com/Manual/tilemaps/work-with-tilemaps/tilemap-reference.html),ScriptReference/Tilemaps.Tilemap,以及 2D Tilemap Extras 软件包手册 (https://docs.unity3d.com/Packages/[email protected]/manual/index.html)中的 Rule Tiles。(@6.0是随 Unity 6.3 LTS 发布的版本;旧版@1.6文档适用于 Unity 2021 年代的项目。)
相关技能
level-design— 与引擎无关的灰盒搭建、节奏把控和瓦片布局实践。procedural-gen— 生成要传入SetTilesBlock的瓦片数据(噪声、RNG、地牢)。platformer/roguelike— 将此技能与移动和生成结合使用的游戏类型。
评论
支持 Markdown