Unity编辑器中等距网格(Z轴为Y轴)Gizmo居中问题求助
Tilemap线框居中与坐标显示修复
你的问题核心是CellToWorld返回的是单元格的原点位置(默认对应Tile的左下角),而Gizmos.DrawWireCube需要传入立方体的中心点坐标,同时坐标标签的位置也需要调整才能正常显示在Tile区域内。
修改后的代码如下:
using UnityEngine; using UnityEditor; using UnityEngine.Tilemaps; [ExecuteAlways] public class TilemapDebugger : MonoBehaviour { public Grid grid; private void OnDrawGizmos() { if (grid == null) return; Tilemap[] tilemaps = grid.GetComponentsInChildren<Tilemap>(); foreach (Tilemap tilemap in tilemaps) { DrawTilePositions(tilemap, Color.green); } } private void DrawTilePositions(Tilemap tilemap, Color color) { Gizmos.color = color; // 预计算单元格半尺寸,避免重复计算 Vector3 halfCellSize = grid.cellSize * 0.5f; foreach (Vector3Int pos in tilemap.cellBounds.allPositionsWithin) { TileBase tile = tilemap.GetTile(pos); if (tile != null) { Vector3 worldPos = grid.CellToWorld(pos); // 计算Tile的中心世界坐标 Vector3 tileCenter = worldPos + halfCellSize; // 将坐标标签显示在Tile中心上方,避免与线框重叠 Handles.Label(tileCenter + new Vector3(0, 0.2f, 0), pos.ToString()); // 以Tile中心为基准绘制线框立方体 Gizmos.DrawWireCube(tileCenter, grid.cellSize); } } } }
关键改动说明
- 计算
halfCellSize:提前算出单元格尺寸的一半,避免循环内重复计算,提升效率。 - 修正线框中心:通过
worldPos + halfCellSize得到Tile的中心坐标,确保线框完美贴合Tile边界并居中。 - 调整标签位置:将坐标标签移到Tile中心上方,避免被线框遮挡,同时保证标签始终处于Tile的可视范围内。
内容的提问来源于stack exchange,提问作者Sergio García Vico
相关产品推荐
相关产品推荐

