mcpField
U
unity-tilemap-2d

unity-tilemap-2d

github.com/gamedev-skills开发5.4k6.1k 次安装今天更新
代码仓库

关于 unity-tilemap-2d

面向 Unity 6.3 LTS 项目的开发者,介绍使用 Grid 和 Tilemap 绘制、碰撞与脚本编辑 2D 地图的方法,并覆盖 Rule Tiles 等工作流。

主要功能

  1. 01创建 Grid 与分层 Tilemap
  2. 02使用 Tile Palette 绘制地图
  3. 03配置 Tilemap 碰撞体
  4. 04通过 Rule Tiles 自动铺砖
  5. 05脚本运行时编辑与批量填充

适用场景

  1. 01搭建带背景、地面和前景的 2D 关卡
  2. 02为地图实体层添加合并碰撞体
  3. 03用脚本生成房间或地板区域
  4. 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。

核心工作流

  1. **创建网格:**GameObject → 2D Object → Tilemap → Rectangular(Grid 的 Cell Layout 还提供 Hexagonal 和 Isometric 布局,适用于六边形/等距视角关卡)。这会创建一个带有 Tilemap 子对象(及 TilemapRenderer)的 Grid。每个图层(背景、地面、前景)使用一个 Tilemap,并设置各渲染器的排序。
  2. 打开 Tile Palette(Window → 2D → Tile Palette),拖入切片后的精灵图集以创建 Tile 资源,然后使用画笔工具绘制。
  3. **为实心图层添加碰撞:**添加 TilemapCollider2D。如需使用一个合并后的碰撞体(性能开销低得多且没有缝隙),还要添加 CompositeCollider2D(及一个设为 Static 的 Rigidbody2D),并在 Tilemap 碰撞体上启用 Used By Composite。
  4. 使用 Rule Tiles 自动拼接(2D Tilemap Extras),自动为边缘/角落选择合适的精灵,而不必手动放置每种变体。
  5. 通过脚本在运行时编辑,使用单元格坐标(Vector3Int):调用 SetTile、GetTile、SetTilesBlock,并使用 Grid/Tilemap 转换世界坐标↔单元格坐标。
  6. **验证:**在 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