Unity3D獨立游戲開發日記(一):動態生成樹木


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM