Unity 2D中获取Grid下TileMap相对于世界中心的位置
Unity 2D TileMap 世界位置获取问题解决
问题本质
TileMap 是 Grid 组件的子对象,TileMap 自身的 Transform 显示的是相对于 Grid 的本地坐标,默认就是 (0,0,0)。真正决定整个 TileMap 世界位置的是父对象 Grid 的 Transform 组件——你移动 Grid,TileMap 才会跟着在世界空间里移动。
解决方案
1. 获取 TileMap 整体的世界位置
直接读取 Grid 的世界坐标即可,因为 TileMap 是 Grid 的子对象且本地坐标为 (0,0,0),两者的世界位置完全一致。
代码示例:
using UnityEngine; using UnityEngine.Tilemaps; public class GetTileMapWorldPos : MonoBehaviour { [SerializeField] private Tilemap myTilemap; void Start() { Transform gridTransform = myTilemap.transform.parent; Vector3 tilemapWorldPos = gridTransform.position; Debug.Log("TileMap 整体世界位置:" + tilemapWorldPos); } }
2. 获取单个 Tile 的世界位置
如果需要 TileMap 中某个特定网格坐标对应的世界位置,用 TileMap 自带的 CellToWorld 方法,它会自动计算 Grid 的单元格大小、间隙等参数:
代码示例:
using UnityEngine; using UnityEngine.Tilemaps; public class GetSingleTileWorldPos : MonoBehaviour { [SerializeField] private Tilemap myTilemap; [SerializeField] private Vector3Int targetTileGridPos = new Vector3Int(0, 0, 0); // 目标Tile的网格坐标 void Start() { Vector3 tileWorldPos = myTilemap.CellToWorld(targetTileGridPos); Debug.Log("目标Tile的世界位置:" + tileWorldPos); } }
3. 调整 TileMap 的显示位置
如果想让 TileMap 在 Scene 视图中移动,直接修改 Grid 的 Transform.Position 就行——不要去改 TileMap 自身的坐标,因为它的位置是相对于 Grid 网格的,改了会导致 Tile 显示错位。
额外提示
- 检查 Inspector 面板时,注意区分 Transform 组件里的「本地坐标(Local Position)」和「世界坐标(World Position)」,可以通过右键 Transform 标题切换显示模式
- Grid 的
Cell Size参数会影响每个 Tile 的实际世界大小,CellToWorld方法会自动考虑这个值,无需手动计算
内容的提问来源于stack exchange,提问作者Alfie
相关产品推荐
相关产品推荐

