• 此篇重點

  此篇是要以程式碼來改變地形,在某些時候要用unity畫出一個工整的地形或是曲線是較困難的,或是一些需求要在遊戲中改變地形的高度,此時就需要用的此功能的呈現。

  • 此篇效果 -  利用Unity C#來改變地形

  此篇的教學會教學如何將地形成一圓柱、矩形,用這樣的方式讓大家知道在地形改變及一些Terrain物件的基本認識


public class ChangeTerrainHeight : MonoBehaviour {

     public Terrain theTerrain;

    int WidthTer;

    int HeightTer;

 

    //unity 預設的高度倍率,在terrain.setting.resolution裡面

    float muti = 600;

}


在開始改變地貌前,我們先預設上述幾個數值物件

  • Terrain是要來存取最主要的地形物件,設置public以供Unity編輯頁面直接代入
  • WidthTer, HeightTer則是儲存Terrain的長寬
  • muti則是Terrain的高度倍率,因為等等在HeightMap的高度設置時,若將值直接代入,會產生高度倍率不相同的問題,要將其除去

 

接下來講到設置高度的部分


void changeTerrain(){

        //heights指的是在此terrain上的所有點的height數值,先初始擷取所有點

        float[,] heights = theTerrain.terrainData.GetHeights(0 , 0 , WidthTer , HeightTer);

 

         //改變heights,提供設置

         heights = ………………………….;

 

        theTerrain.terrainData.SetHeights(0,0,heights);

    }


在設置高度裡面,有個極其重要的東西,就是二微陣列的theTerrain.terrainData.GetHeights(,,,)

他的做法就是將位置(0,0) , (0,1), (0,2)…等的全部高度取出,以便等等設置其數值

 

theTerrain.terrainData.SetHeights(,,),就是其設置方式

而在heights的設置

可以使用

heights(0,0) = 100.0f / muti; 這樣的方式來改變

因為地形的高度大多都是連續的,正常來說都會配合迴圈做高度改變

 

若是要做成某些特定圖形的地形,可以將它寫成function,這樣重複使用時比較方便

在這邊提供兩個function給大家參考


float[,] makeCircleHeights(float[,] heights , int posX , int posZ , int radius , float setHeight){

        for(int z = posZ - radius; z < posZ + radius; z++){

            for(int x = posX - radius; x < posX + radius; x++){

                if(Mathf.Pow (posZ - z, 2) + Mathf.Pow (posX - x, 2) < Mathf.Pow(radius , 2)){

                    heights[x, z] = setHeight;

                }

            }

        }

        return heights;

    }


    float[,] makeRectangleHeights(float[,] heights, int startX, int startZ , int theLong , int width , float setHeight){

        for (int z = startZ; z < startZ + width; z++){

            for (int x = startX; x < startX + theLong; x++){

                heights[x, z] = setHeight;

            }

        }

        return heights;

    }


makeCircleHeights也就是做一個圓柱體的例子

makeRectangleHeights則是做矩形的

用矩形則是設置起始XY位置,矩形長寬

 

假如使用

heights = makeCircleHeights(heights , 100 , 100 , 50 , 10.0f / muti);

 

就可以看到地圖會變成

 

相互配合也可以變成不同形狀


heights = makeCircleHeights(heights , 100 , 100 , 50 , 10.0f / muti);

heights = makeCircleHeights(heights, 100, 100, 40, 0.0f / muti);

heights = makeRectangleHeights(heights, 50, 95, 90 , 10 , 10.0f / muti);


 

這段code也放在此處讓大家下載

 

若用更多判斷或是迴圈寫法,也可以做成階梯式的地形

 

除了使用code,在地形方面也可以先做成2D的圖片,再依深淺去拉地形,類似分層設色圖的概念,而這就讓我們留到下次再詳解八XD

 

-------------------------------------------------------------------------------------------------------------------------------------

 

我們有粉絲專頁囉!!!       

如果怕有問題連絡不到我們,歡迎隨時私訊FB粉專哦!!!

https://www.facebook.com/Straying2018/

 

●     如果這篇文章有幫助到您,希望您能留言給予我們鼓勵 !  

●     對於文章有任何的建議,非常歡迎留言告訴我們哦 !!!  

●     有任何想知道的功能也歡迎告訴我們,我們會盡快寫成部落格分享給大家 !

arrow
arrow
    文章標籤
    unity C# 地形
    全站熱搜

    twilighthook 發表在 痞客邦 留言(0) 人氣()