回覆列表
  • 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/

  • 中秋節和大豐收的關聯?
  • 拍人像的基礎是構圖嗎?