-
Notifications
You must be signed in to change notification settings - Fork 13
1.画六边形
Welcome to the HexMapMadeInUnity2019ECS wiki!
上一篇中我们已经成功生成了地图矩阵,可是却不是基于六边形单元的,因为我们还没有开始绘制六边形单元。 如下图所示,画好的六边形单元是这样的: 如何画一个六边形呢? 首先要对图形学基础有一定的认识,Unity引擎当中渲染出来的图形都是由网格(Mesh)构成的,而网格又是由无数的顶点(Vertex)连接而成。其中每三个顶点又构成了一个基本单位:三角(Triangle),仔细看看网格的图片就会发现:
复杂的外观下面是简单的图形学。
就如图中的正方体(Cube),一共六个面,每个面有两个三角,每个三角有三个顶点,拆解开了,就好绘制了(当然,还有法线/材质/贴图等等,这里暂时忽略。我们先做减法,后面再做加法)。 首先我们要计算三个顶点出来,这样我们就可以画出三角形了。
/// <summary>
/// 把所有六边形单元中心点作为所有顶点的起始点
/// </summary>
[BurstCompile]
private struct CopyHexCellCenterPositionsToVerticesJob : IJobForEachWithEntity<Translation> {
public NativeArray<Vector3> Vertices;
public void Execute(Entity entity, int index, [ReadOnly]ref Translation position)
{
var center = position.Value;
Vertices[index] = new Vector3
{
x = center.x,
y = center.y,
z = center.z
};
}
}
- 获取到上一篇中创建的HexCell,并得到其坐标作为三角的一个顶点,这个顶点放到六边形中正好是六边形的正中心;
- 如上图所示,中心那朵菊花就是六边形的圆心顶点,由这个顶点推算出另外两个顶点的坐标;
//HexMetrics.corners是上一篇中定义的六边形的个六个角
Vector3 顶点2=(center + HexMetrics.corners[0])
Vector3 顶点3=(center + HexMetrics.corners[1])
- 把数据交给网格组件进行渲染,三角就绘制出来了。
//顶点和三角
renderMesh.mesh.vertices = Vertices.ToArray();
renderMesh.mesh.triangles = Triangles.ToArray();
//重新计算法线
renderMesh.mesh.RecalculateNormals();
如上图所示,三角就顺利画出来了,接下来把刚刚的算法循环六次,六个这样的三角就组成了六边形:
Vector3 center = vertices[i];
for (int j = 0; j < 6; j++)
{
int verticesIndex = Vertices.Length;
Vertices.Add(center);
Vertices.Add(center + HexMetrics.corners[j]);
Vertices.Add(center + HexMetrics.corners[j + 1]);
Triangles.Add(verticesIndex);
Triangles.Add(verticesIndex + 1);
Triangles.Add(verticesIndex + 2);
}
最终效果如上图所示!
之前使用预设来作为六边形单元的模板,现在做了优化,干掉了预设。代码如下:
//代码生成预设,这样可以优化性能
Entity hexCellPrefab = CommandBuffer.CreateEntity(index);
CommandBuffer.AddComponent<HexCellData>(index, hexCellPrefab);
CommandBuffer.AddComponent< Translation >(index, hexCellPrefab);
//三行代码,我们成功干掉一个预设
非常简单的代码,节省了一点点内存,使用完后再摧毁:
//摧毁使用完的预设,节约内存资源
CommandBuffer.DestroyEntity(index, hexCellPrefab);
今天就写这么点吧,已经把项目上传到Github,有兴趣的朋友可以看看:HexMapMadeInUnity2019ECS
![Alt](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9hdmF0YXIuY3Nkbi5uZXQvNy83L0IvMV9yYWxmX2h4MTYzY29tLmpwZw =30x30)
如果喜欢我的文章可以点赞支持一下,谢谢鼓励!如果有什么疑问可以给我留言,有错漏的地方请批评指证! 如果有技术难题需要讨论,可以加入开发者联盟:566189328(付费群)为您提供有限的技术支持,以及,心灵鸡汤! 当然,不需要技术支持也欢迎加入进来,随时可以请我喝咖啡、茶和果汁!( ̄┰ ̄*)