目前寫的獨立遊戲是一個沙盒類型的遊戲。遊戲DEMO視頻以下:php
提到沙盒類型的遊戲,就有人給出了這樣的定義:app
遊戲世界離現實世界越近,自由度、隨機度越高才叫沙盒遊戲。所謂自由度,就是你在遊戲裏想幹啥就幹啥,想開車就開車,想走路就走路。想蓋房子就蓋房子,沒有城管來找你麻煩。那麼隨機度,就是天天發生的事情不能同樣,作的任務也不會就一條線路可走。ide
在個人沙盒遊戲裏,地形上的樹木,岩石等都是隨機生成的,這樣不一樣的人玩的地圖都會不同。固然若是最後能作到地形也隨機生成那就更完美了。函數
下面我就講下樹木隨機生成在地圖上的原理。3d
在unity3d裏要想動態生成一個GameObject,那須要使用Instantiate函數加載樹木的模型組件到指定的座標位置上。視頻
咱們的實現步驟以下:blog
1.在unity3d裏的Assets目錄下建立Prefabs文件夾,而後在其中建立Resources(重要:否則沒法用代碼動態加載)子文件夾,再把樹木的模型預製件放入其中。遊戲
2.使用Instantiate函數動態加載樹木預製件ip
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