本文旨在六边形网格精简版绘制,可以此为基础实现具体的功能
六边形网格是用一个二维数组进行存放,能最大程度的对应正方形网格以及替换,具体实现如下:
面板部分
其中的Text为预制体,用于显示对应的格子下标
HexagonModal类
using UnityEngine;
public class HexagonModal
{
public const float outerRadius = 10f; //外圈半径
public const float innerRadius = outerRadius * 0.866025404f;
public static Vector3[] corners = {
new Vector3(0f, 0f, outerRadius),
new Vector3(innerRadius, 0f, 0.5f * outerRadius),
new Vector3(innerRadius, 0f, -0.5f * outerRadius),
new Vector3(0f, 0f, -outerRadius),
new Vector3(-innerRadius, 0f, -0.5f * outerRadius),
new Vector3(-innerRadius, 0f, 0.5f * outerRadius),
new Vector3(0f, 0f, outerRadius)
};
}
HexGridCell类
using UnityEngine;
public class HexGridCell : MonoBehaviour
{
public HexGrid grid; //隶属问题
public Vector3 CenterPos;
public HexagonModal Cell;
}
HexGrid类
using UnityEngine;
using UnityEngine.UI;
public class HexGrid : MonoBehaviour
{
public HexGridCell[,] cells;
public int Width=1;
public int Height=1;
public Canvas CanvasShow;
public Text TextPrefab;
private void Start()
{
cells = new HexGridCell[Width, Height];
CreateCell();
}
/// <summary>
/// 创建网格
/// </summary>
void CreateCell()
{
for (int i = 0; i < Width; i++)
{
for (int j = 0; j < Height; j++)
{
HexGridCell cell = new HexGridCell();
Vector3 position;
position .x= (j + (i%2) * 0.5f) * (HexagonModal.innerRadius * 2f);
position .y = 0;
position .z = i * (HexagonModal.outerRadius * 1.5f);
cell.CenterPos = position;
cells[i, j] = cell;
#region 显示格子下标
TextPrefab.text = i + "," + j;
Quaternion q1 = new Quaternion();
q1.eulerAngles = new Vector3(90, 0, 0);
Text go= Instantiate(TextPrefab, cell.CenterPos,q1);
go.transform.SetParent(CanvasShow.transform);
for (int k = 0; k <= 6; k++)
{
Debug.DrawLine(cells[i, j].CenterPos + HexagonModal.corners[k], cells[i, j].CenterPos + HexagonModal.corners[(k + 1) % 7], Color.green, 20000);
}
#endregion
}
}
}
}
参考 https://www.redblobgames.com/grids/hexagons/ (此文对正六边形网格系统有较丰富的介绍以及应用)
本文为自行理解完成以及分享,如有不妥之处,欢迎指正。