如何获取Unity Tilemap中点朝上六边形Tile角点的世界坐标?
Unity点朝上六边形Tile角点世界坐标获取方案

1. CellToWorld返回值是否为Tile中心点
默认配置下是。Unity Tilemap的CellToWorld方法返回的是单元格锚点对应的世界坐标,六边形Tile的默认单元格锚点为(0.5, 0.5, 0),刚好对应六边形的几何中心位置。
如果手动修改过Tilemap的锚点配置,需要以实际设置的锚点为准调整后续计算逻辑。
2. 六个角点世界坐标计算方法
点朝上的六边形几何特征固定,只要拿到中心坐标和外接圆半径即可算出所有角点,具体步骤如下:
- 第一步:获取基础参数
- 调用
CellToWorld得到目标Tile的中心世界坐标 - 获取Tilemap的单元格高度,中心到顶点的外接圆半径
R等于单元格高度的1/2
- 调用
- 第二步:按角度计算六个顶点相对中心的偏移量,按顺时针排序依次为:
- 顶部顶点:(0, R)
- 右上顶点:(R * √3/2, R * 1/2)
- 右下顶点:(R * √3/2, -R * 1/2)
- 底部顶点:(0, -R)
- 左下顶点:(-R * √3/2, -R * 1/2)
- 左上顶点:(-R * √3/2, R * 1/2)
完整示例代码
// 目标六边形单元格坐标 Vector3Int targetCellPos = new Vector3Int(4, 8); // 获取单元格中心世界坐标 Vector3 tileCenterWorldPos = MyTileMap.CellToWorld(targetCellPos); // 计算外接圆半径R float R = MyTileMap.cellSize.y / 2f; // 预计算常用偏移参数 float halfSqrt3R = R * Mathf.Sqrt(3) / 2f; float halfR = R * 0.5f; // 按顺时针顺序存储所有角点世界坐标 List<Vector3> tileCorners = new List<Vector3>() { tileCenterWorldPos + new Vector3(0, R, 0), // 顶部 tileCenterWorldPos + new Vector3(halfSqrt3R, halfR, 0), // 右上 tileCenterWorldPos + new Vector3(halfSqrt3R, -halfR, 0), // 右下 tileCenterWorldPos + new Vector3(0, -R, 0), // 底部 tileCenterWorldPos + new Vector3(-halfSqrt3R, -halfR, 0), // 左下 tileCenterWorldPos + new Vector3(-halfSqrt3R, halfR, 0) // 左上 };
注意事项
如果你的Tilemap调整过Cell Swizzle、单元格缩放、自定义锚点等参数,需要根据实际修改的数值对应调整偏移量的计算逻辑,默认六边形布局下上述代码可直接复用。
内容的提问来源于stack exchange,提问作者manking
相关产品推荐
相关产品推荐

