關於六邊形地圖的生成算法

需要能動態改變地圖的層數,當輸入的layer不同生成的地圖層數也就不同,所以我使用算法動態生成棋盤格地圖。

通過定義好的tileWeight和tileHeight,i從下到上,j從左到右確定每個格子的世界座標x,y。

關鍵代碼如下:

for(int i=2*layer-1);i>=0;i--){
    int count=(i>=layer?3*layer-2-i:i+layer);//count代表當前行的格子數
    for(int j=0;j<count;j++)
    {
        float x=j*tileWeight-(count-1)*tileWeight/2;
        float y=(i-layer+1)*tileHeight;
    }
}

 

我將生成的格子定義x,y,z三個座標

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

在這個上有解釋,如以下圖

好吧,其實這個不是關鍵,沒有定義也不影響我地圖的生成,只是定義了之後格子的位置可以很方便的獲得

生成地圖格子的代碼如下:(Unity3D的腳本)

GameObject go = Instantiate(TilePrefab,new Vector3(x,y,0),TilePrefab.transform.localRotation);
Tile tile=go.AddComponent<Tile>();
tile.x=i<layer?j+1-layer:j-(2*layer-i-2);
tile.y=i<layer?i-j:layer-j-1;
tile.z=Layer-i-1;

將以上代碼寫到for裏面的x,y值下面即可,這裏還要新建一個Tile(格子)類定義x,y,z

生成效果:將layer設置爲4就可以生成如上面的六邊形圖

我在自己的Unity項目中設置好一個TilePrefab生成如下:

那麼如果我要在這個地圖上再實現尋路,最基本的我需要兩個Tile的距離值

public float Distance(Tile a,Tile b)
{
    return (Mathf.Abs(a.x-b.x)+Mathf.Abs(a.y-b.y)+Mathf.Abs(a.z-b.z));
}

其它的衍生就不一一實現了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章