需要能動態改變地圖的層數,當輸入的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));
}
其它的衍生就不一一實現了。