unity3d模拟树叶飘动_Unity3D独立游戏开发日记(一):动态生成树木
目前寫的獨(dú)立游戲是一個(gè)沙盒類型的游戲。游戲DEMO視頻如下:
提到沙盒類型的游戲,就有人給出了這樣的定義:
游戲世界離現(xiàn)實(shí)世界越近,自由度、隨機(jī)度越高才叫沙盒游戲。所謂自由度,就是你在游戲里想干啥就干啥,想開車就開車,想走路就走路。想蓋房子就蓋房子,沒有城管來(lái)找你麻煩。那么隨機(jī)度,就是每天發(fā)生的事情不能一樣,做的任務(wù)也不會(huì)就一條線路可走。
在我的沙盒游戲里,地形上的樹木,巖石等都是隨機(jī)生成的,這樣不同的人玩的地圖都會(huì)不一樣。當(dāng)然如果最后能做到地形也隨機(jī)生成那就更完美了。
下面我就講下樹木隨機(jī)生成在地圖上的原理。
在unity3d里要想動(dòng)態(tài)生成一個(gè)GameObject,那需要使用Instantiate函數(shù)加載樹木的模型組件到指定的坐標(biāo)位置上。
我們的實(shí)現(xiàn)步驟如下:
1.在unity3d里的Assets目錄下創(chuàng)建Prefabs文件夾,然后在其中創(chuàng)建Resources(重要:不然無(wú)法用代碼動(dòng)態(tài)加載)子文件夾,再把樹木的模型預(yù)制件放入其中。
2.使用Instantiate函數(shù)動(dòng)態(tài)加載樹木預(yù)制件
var itemResource = Resources.Load("Tree"+i);?? //I是可變隨機(jī)數(shù)
GameObject itemObj = Instantiate(itemResource, new Vector3(X, Y, Z), Quaternion.identity) as GameObject;
3.使用循環(huán)改變i的值,以及改變X,Y,Z的值。
要注意的是i的值范圍,要和樹木預(yù)制件的編號(hào)匹配。X,Y,Z的值也要控制在地圖地形空間范圍內(nèi)。
按照這樣的思路,我們很快就能隨機(jī)生成樹木了。但是仔細(xì)想想這樣就可以了么?我們的X,Y,Z是隨機(jī)的坐標(biāo)值,其中Y的值是游戲世界里的高度值。如果Y的值隨機(jī)出來(lái)的值過(guò)大或者過(guò)小(相對(duì)于地表高度而言),那么就悲劇了,樹木不是長(zhǎng)在天上,就是長(zhǎng)在地底下。
怎么才能讓樹木剛好長(zhǎng)在地表高度上呢?這是我們遇到的難點(diǎn)問(wèn)題。如果有一個(gè)函數(shù)剛好能找到隨機(jī)出的坐標(biāo)位對(duì)應(yīng)的Y軸線和地標(biāo)相交接的那個(gè)點(diǎn)的Y的值就好了。通俗的講,就是要獲取,方位在X,Z時(shí),地表所在的Y值。
按照這個(gè)思路我們就找到了一個(gè)函數(shù),求指定坐標(biāo)對(duì)應(yīng)地面高度的函數(shù):Terrain.activeTerrain.SampleHeight(position)。
這樣我們就得到地表對(duì)應(yīng)的Y的值了:Y=Terrain.activeTerrain.SampleHeight(new Vector3(X,Y,Z))。
剩下的時(shí)間就是碼代碼的時(shí)間了,把核心難題解決了,后面的就簡(jiǎn)單了。不過(guò)需要注意的是,如果地形不是用Terrain組件來(lái)創(chuàng)建的,而是用的美工模型的話,就需要使用射線(Ray)來(lái)找到射線和地標(biāo)相交的點(diǎn)。
PS:游戲DEMO試玩群:198035671? Unity3d技術(shù)交流群:308185833? 斗魚游戲開發(fā)直播地址:www.douyutv.com/unity3d
總結(jié)
以上是生活随笔為你收集整理的unity3d模拟树叶飘动_Unity3D独立游戏开发日记(一):动态生成树木的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 语音通话框架_普通话考试得高分的方法
- 下一篇: Linux如何查看硬盘的使用情况