Unity 六边形地图系列(一) 【笔记】: 创建一个六边形网格

原文 https://catlikecoding.com/unity/tutorials/hex-map/part-1/

中文 http://gad.qq.com/program/translateview/7173811

请先阅读原文或者中文。


1.内径=外径 * 0.866025404f

根据勾股定理和六边形的特点,x= r * cos(30)

cos(30)应该是个除不尽的数,多个六边形拼接会产生裂缝吗?


2.x坐标的隔行偏移

  position.x = (x + z * 0.5f - z / 2) * (HexMetrics.innerRadius * 2f);

属于代码上的小技巧:

当z是偶数时, (x + z * 0.5f - z / 2) = x, 

当z是奇数时, (x + z * 0.5f - z / 2) = x + 0.5


3.坐标的生成

关键是如何理解

	public static HexCoordinates FromOffsetCoordinates (int x, int z) {
		return new HexCoordinates(x - z / 2, z);
	}

从Awke函数中对CreateCell的调用来看,实际上是一行一行的生成。

        for (int z = 0, i = 0; z < height; z++)
        {
            for (int x = 0; x < width; x++)
            {
                CreateCell(x, z, i++);
            }
        }

如果从下图来看,应该是从左到右(第一行),从下到上(第二行)

Unity 六边形地图系列(一) 【笔记】: 创建一个六边形网格_第1张图片

实际上 HexCoordinates(x - z / 2, z);相对于HexCoordinates(x , z); 实际上是个“错位”(看图理解),看最左下角的(0,0)和最左上角的(-2,5),下图是根据HexCoordinates(x , z); 算的坐标。很明显,这个“错位”的程度和z是有关系的,z越大,“错位”越厉害。

Unity 六边形地图系列(一) 【笔记】: 创建一个六边形网格_第2张图片


4.为什么要有三维坐标

参考 

https://www.cnblogs.com/heweiwei/p/10075896.html

https://blog.csdn.net/icebergkevin/article/details/50173527

https://www.redblobgames.com/grids/hexagons/

Unity 六边形地图系列(一) 【笔记】: 创建一个六边形网格_第3张图片

 

Unity 六边形地图系列(一) 【笔记】: 创建一个六边形网格_第4张图片

看了些参考,结合自己的理解,总结如下:

(1)二维坐标只能是4个方向(紫色和红色的方向)

(2)三维坐标可以代表6个方向。是用二维坐标的x轴的标记规律,在三维去定义y轴。这种坐标的标记方式为立方体坐标。这种情况下x+y+z=0

(3)以上说法对于用二维不能表示6个方向存疑,因为毕竟坐标的取值可以是正和负。不过,这种方式扩展成三维能更好定位方向。比如2个六边形如果x相同,那应该是同在顺时针方向斜着的方向,如果是y相同,那应该是同在逆时针方向斜着的方向。


5.世界坐标转格子坐标

你可能感兴趣的:(地形)