目前寫的獨立遊戲是一個沙盒型別的遊戲。遊戲DEMO視訊如下:
提到沙盒型別的遊戲,就有人給出了這樣的定義:
遊戲世界離現實世界越近,自由度、隨機度越高才叫沙盒遊戲。所謂自由度,就是你在遊戲裡想幹啥就幹啥,想開車就開車,想走路就走路。想蓋房子就蓋房子,沒有城管來找你麻煩。那麼隨機度,就是每天發生的事情不能一樣,做的任務也不會就一條線路可走。
在我的沙盒遊戲裡,地形上的樹木,岩石等都是隨機生成的,這樣不同的人玩的地圖都會不一樣。當然如果最後能做到地形也隨機生成那就更完美了。
下面我就講下樹木隨機生成在地圖上的原理。
在unity3d裡要想動態生成一個GameObject,那需要使用Instantiate函式載入樹木的模型元件到指定的座標位置上。
我們的實現步驟如下:
1.在unity3d裡的Assets目錄下建立Prefabs資料夾,然後在其中建立Resources(重要:不然無法用程式碼動態載入)子資料夾,再把樹木的模型預製件放入其中。
2.使用Instantiate函式動態載入樹木預製件
var itemResource = Resources.Load("Tree"+i); //I是可變隨機數
GameObject itemObj = Instantiate(itemResource, new Vector3(X, Y, Z), Quaternion.identity) as GameObject;
3.使用迴圈改變i的值,以及改變X,Y,Z的值。
要注意的是i的值範圍,要和樹木預製件的編號匹配。X,Y,Z的值也要控制在地圖地形空間範圍內。
按照這樣的思路,我們很快就能隨機生成樹木了。但是仔細想想這樣就可以了麼?我們的X,Y,Z是隨機的座標值,其中Y的值是遊戲世界裡的高度值。如果Y的值隨機出來的值過大或者過小(相對於地表高度而言),那麼就悲劇了,樹木不是長在天上,就是長在地底下。
怎麼才能讓樹木剛好長在地表高度上呢?這是我們遇到的難點問題。如果有一個函式剛好能找到隨機出的座標位對應的Y軸線和地標相交接的那個點的Y的值就好了。通俗的講,就是要獲取,方位在X,Z時,地表所在的Y值。
按照這個思路我們就找到了一個函式,求指定座標對應地面高度的函式:Terrain.activeTerrain.SampleHeight(position)。
這樣我們就得到地表對應的Y的值了:Y=Terrain.activeTerrain.SampleHeight(new Vector3(X,Y,Z))。
剩下的時間就是碼程式碼的時間了,把核心難題解決了,後面的就簡單了。不過需要注意的是,如果地形不是用Terrain元件來建立的,而是用的美工模型的話,就需要使用射線(Ray)來找到射線和地標相交的點。
PS:遊戲DEMO試玩群:198035671 Unity3d技術交流群:308185833 鬥魚遊戲開發直播地址:www.douyutv.com/unity3d