我试图使 OnDrawGizmos() 中的框在每个图块内等距居中。如您所见,我想知道每个图块的坐标并始终将它们显示在编辑器中。正如您所看到的,它们与每个图块都不太适合,我不知道如何修复它。这是代码;我希望你能帮我一把。预先感谢。
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;
foreach (Vector3Int pos in tilemap.cellBounds.allPositionsWithin)
{
TileBase tile = tilemap.GetTile(pos);
if (tile != null)
{
Vector3 worldPos = grid.CellToWorld(pos);
Handles.Label(worldPos, pos.ToString());
Gizmos.DrawWireCube(worldPos, grid.cellSize);
}
}
}
}
为了使 Gizmo 适合对象,您需要将变换矩阵设置为 Gizmos.matrix 属性。
所有变换属性都通过该矩阵与您的对象相关。 使用
Vector3.zero
表示位置,使用 Vector3.one
表示比例,以便精确匹配对象。
Gizmos.matrix = myObject.transform.localToWorldMatrix;
Gizmos.DrawCube(Vector3.zero, Vector3.one);
对于瓦片地图,看起来您可以通过瓦片数据检索矩阵。
Gizmos.matrix = tileData.transform;
创建完小控件后,请确保将矩阵设置回单位矩阵。
Gizmos.matrix = Matrix4x4.identity;