再开个新坑,业余时间做个SLG游戏Demo。将以前工作与学习的积累做一个有效转化。这个专题就长期记录下项目进展,顺便分享下一些技术点。
言归正传,本章主题 六边形。
先说为什么要用六边形做基础地块,主要是用来规避穿越问题,六边形更平滑,每个基础格的距离都一致(斜线移动也是1),并且不存在危险穿越的问题(斜边穿越),斜边穿越符合程序逻辑,但是不符合视觉逻辑,试想两个Cube组成斜线阻挡,主角从中间径自穿越,这很程序化,但是不符合人类直觉。当然可以将寻路的朝向从八向改为四向,这样修改后,原本到斜边的距离为√2,修改后路径长度变为2,需要走两步抵达斜边目标。
六边形
void CreateHexagon()
{
Vector3[] vertices = new Vector3[7];
int[] triangles = new int[18];
float radius = 1f; // 半径为1
float angleOffset = Mathf.PI / 3f; // 60度的偏移角度
// 旋转角度
float rotationAngle = Mathf.PI / 2f;
// 六个顶点
for (int i = 0; i < 6; i++)
{
float angle = angleOffset * i + rotationAngle;
// 旋转顶点
vertices[i] = new Vector3(Mathf.Cos(angle) * radius, 0f, Mathf.Sin(angle) * radius);
}
// 中心点
vertices[6] = Vector3.zero;
// 三角形顺序
for (int i = 0; i < 6; i++)
{
triangles[i * 3] = 6; // 中心点
triangles[i * 3 + 1] = i; // 当前顶点
triangles[i * 3 + 2] = (i + 1) % 6; // 下一个顶点,如果是最后一个顶点则连接第一个顶点
}
mesh.vertices = vertices;
mesh.triangles = triangles;
}