Skip to content

1.画六边形

Cloud Hu edited this page Aug 23, 2019 · 1 revision

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
            };
        }
    }
  1. 获取到上一篇中创建的HexCell,并得到其坐标作为三角的一个顶点,这个顶点放到六边形中正好是六边形的正中心; 在这里插入图片描述
  2. 如上图所示,中心那朵菊花就是六边形的圆心顶点,由这个顶点推算出另外两个顶点的坐标;
//HexMetrics.corners是上一篇中定义的六边形的个六个角
Vector3 顶点2=(center + HexMetrics.corners[0])
Vector3 顶点3=(center + HexMetrics.corners[1])
  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![Alt](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9hdmF0YXIuY3Nkbi5uZXQvNy83L0IvMV9yYWxmX2h4MTYzY29tLmpwZw =30x30)

如果喜欢我的文章可以点赞支持一下,谢谢鼓励!如果有什么疑问可以给我留言,有错漏的地方请批评指证! 如果有技术难题需要讨论,可以加入开发者联盟:566189328(付费群)为您提供有限的技术支持,以及,心灵鸡汤! 当然,不需要技术支持也欢迎加入进来,随时可以请我喝咖啡、茶和果汁!( ̄┰ ̄*)

ECS系列目录