JinChanChan/Assets/Scripts/Hexagon/HexagonMesh.cs

69 lines
2.0 KiB
C#

using System;
using UnityEditor;
using UnityEngine;
// 创建正六边形网格的脚本
public class HexagonMesh : MonoBehaviour
{
public float radius = 1f; // 六边形的边长
public float offset = 30f; // 30f or 0f
void Start()
{
RefreshMesh(offset);
}
void RefreshMesh(float offset)
{
Mesh mesh = new Mesh();
Vector3[] vertices = new Vector3[7];
int[] triangles = new int[18];
// 计算六个顶点
for (int i = 0; i < 6; i++)
{
float angle = Mathf.Deg2Rad * (60 * i) + offset;
vertices[i] = new Vector3(radius * Mathf.Cos(angle), radius * Mathf.Sin(angle), 0);
}
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;
mesh.RecalculateNormals();
mesh.RecalculateBounds();
MeshFilter meshFilter = gameObject.AddComponent<MeshFilter>();
meshFilter.mesh = mesh;
var meshRenderer = gameObject.AddComponent<MeshRenderer>();
meshRenderer.material = new Material(Shader.Find("Standard"));
}
void OnDrawGizmos()
{
Gizmos.color = Color.green;
Vector3[] vertices = new Vector3[6];
for (int i = 0; i < 6; i++)
{
float angle = Mathf.Deg2Rad * (60 * i);
vertices[i] = transform.position + new Vector3(Mathf.Cos(angle) * radius, Mathf.Sin(angle) * radius, 0);
}
// 绘制六边形边缘
for (int i = 0; i < 6; i++)
{
Gizmos.DrawLine(vertices[i], vertices[(i + 1) % 6]);
Handles.color = Color.red;
Handles.Label(vertices[i], vertices[(i + 1) % 6].ToString());
}
}
}