這個已經有很成熟的做法了,這篇文章有非常詳細的例子Hex Map 1。直接上程式碼:
public static HexCoordinates FromPosition (Vector3 position) {
float x = position.x / (HexMetrics.innerRadius * 2f);
float y = -x;
float offset = position.z / (HexMetrics.outerRadius * 3f);
x -= offset;
y -= offset;
int iX = Mathf.RoundToInt(x);
int iY = Mathf.RoundToInt(y);
int iZ = Mathf.RoundToInt(-x -y);
if (iX + iY + iZ != 0) {
float dX = Mathf.Abs(x - iX);
float dY = Mathf.Abs(y - iY);
float dZ = Mathf.Abs(-x -y - iZ);
if (dX > dY && dX > dZ) {
iX = -iY - iZ;
}
else if (dZ > dY) {
iZ = -iX - iY;
return new HexCoordinates(iX + iZ/2, iZ);
HexMetrics.innerRadius和HexMetrics.outerRadius為六邊形的內邊長和外邊長:
public const float outerRadius = 10f;
public const float innerRadius = outerRadius * 0.866025404f;
除了提供簡便高效的計算六邊形座標外,這篇文章還有一個非常重要的概念,就是使用x,y,z三個座標來表示六邊形的座標,這樣做可以減少很多奇偶行的判斷,強烈建議你把這篇文章吃透
文章:https://catlikecoding.com/unity/tutorials/hex-map/part-1/
這個已經有很成熟的做法了,這篇文章有非常詳細的例子Hex Map 1。直接上程式碼:
public static HexCoordinates FromPosition (Vector3 position) {
float x = position.x / (HexMetrics.innerRadius * 2f);
float y = -x;
float offset = position.z / (HexMetrics.outerRadius * 3f);
x -= offset;
y -= offset;
int iX = Mathf.RoundToInt(x);
int iY = Mathf.RoundToInt(y);
int iZ = Mathf.RoundToInt(-x -y);
if (iX + iY + iZ != 0) {
float dX = Mathf.Abs(x - iX);
float dY = Mathf.Abs(y - iY);
float dZ = Mathf.Abs(-x -y - iZ);
if (dX > dY && dX > dZ) {
iX = -iY - iZ;
}
else if (dZ > dY) {
iZ = -iX - iY;
}
}
return new HexCoordinates(iX + iZ/2, iZ);
}
HexMetrics.innerRadius和HexMetrics.outerRadius為六邊形的內邊長和外邊長:
public const float outerRadius = 10f;
public const float innerRadius = outerRadius * 0.866025404f;
除了提供簡便高效的計算六邊形座標外,這篇文章還有一個非常重要的概念,就是使用x,y,z三個座標來表示六邊形的座標,這樣做可以減少很多奇偶行的判斷,強烈建議你把這篇文章吃透
文章:https://catlikecoding.com/unity/tutorials/hex-map/part-1/