目前寫的獨立游戲是一個沙盒類型的游戲。游戲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