新聞中心
(如果您以為是這樣的技術(shù)和代碼)那就不用看了。這個(gè)技術(shù)的實(shí)質(zhì)意義是為了解決--多地形場(chǎng)景帶來(lái)的大量?jī)?nèi)存占用問(wèn)題-舉個(gè)我的例子-我的測(cè)試項(xiàng)目是1013張繪制地形--在不用上面的技術(shù)情況下-占用了我4.2G的內(nèi)存(還好我電腦16G)想想下-如果一個(gè)大型的游戲直接這么運(yùn)行的話(當(dāng)然是不可能會(huì)這樣傻的)一下就會(huì)帶來(lái)5-8G的內(nèi)存占用--這個(gè)游戲還能玩嗎?(當(dāng)然這個(gè)8G的占用內(nèi)存也沒(méi)換來(lái)他應(yīng)該的效果,所以是浪費(fèi))

創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),廣宗企業(yè)網(wǎng)站建設(shè),廣宗品牌網(wǎng)站建設(shè),網(wǎng)站定制,廣宗網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,廣宗網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
涉及到幾個(gè)U3D函數(shù):
Application.LoadLevel(lv):場(chǎng)景讀取(記著用多場(chǎng)景前要現(xiàn)在File-Build Setting里登記下場(chǎng)景,才能在腳本里讀取到)
DontDestroyOnLoad(object):保持物體在場(chǎng)景切換的時(shí)候不被卸載(能保持他的所有屬性哦)
*AssetBundle類:預(yù)讀資源(主要用于web3d,運(yùn)行時(shí)實(shí)時(shí)從服務(wù)器下載需要的場(chǎng)景資源)
涉及到幾個(gè)基礎(chǔ)知識(shí):
static 靜態(tài)類、靜態(tài)變量:在整個(gè)游戲中都不會(huì)被重新加載,所以可以當(dāng)全局全場(chǎng)景變量使用,主要用于記錄場(chǎng)景數(shù)組。
Collider的Is Trigger屬性:設(shè)置成True,他是可以穿越不會(huì)產(chǎn)生能量傳遞的,但是,他是可以接受碰撞偵測(cè)的。配合主角的OnTriggerEnter事件,就可以知道你是否正在穿越一個(gè)Trigger了。在這里,我們用在判斷何時(shí)加載新場(chǎng)景上。
2.制作場(chǎng)景邊界
使用Cube + IsTrigger=True屬性是***的辦法。
如果是雙場(chǎng)景切換,注意兩個(gè)場(chǎng)景邊界坐標(biāo)別重在一起,不然你走到邊界會(huì)發(fā)現(xiàn)兩個(gè)邊界不停的切換=.=,要讓2個(gè)場(chǎng)景邊界互相交錯(cuò)一起。有必要的話,邊界可以往里面縮一點(diǎn)(甚至可以吧場(chǎng)景重疊1/3,但這樣兩個(gè)場(chǎng)景你要做很多重復(fù)的東西),避免用戶看到邊界。
3.編寫腳本
先理清楚邏輯關(guān)系以及一些常識(shí):
1.是主攝像機(jī)走到邊界才會(huì)做場(chǎng)景加載或卸載動(dòng)作。所以代碼是放在主攝像機(jī)上或者主角上。
2.場(chǎng)景可以加載,但是沒(méi)有卸載場(chǎng)景這個(gè)東西(也沒(méi)必要卸載,因?yàn)橥粫r(shí)間只會(huì)有一個(gè)場(chǎng)景為當(dāng)前場(chǎng)景),所以如果你用九宮格方式做無(wú)縫連接,你需要把場(chǎng)景讀取,然后讓場(chǎng)景里所有物體DontDestroyOnLoad(當(dāng)然包括主角,也就是this),然后其他場(chǎng)景也這么操作,當(dāng)需要卸載場(chǎng)景時(shí),只要把所有那個(gè)場(chǎng)景Object給Destroy掉就可以了。而做雙場(chǎng)景連接則不需要這樣,也簡(jiǎn)單的多。Unity3D教程手冊(cè):www.unitymanual.com
3.如果是九宮格,你需要一個(gè)靜態(tài)二維數(shù)組去記錄每個(gè)位置場(chǎng)景的名字。這里也可以不需要這么做,有個(gè)技巧,你可以格式化場(chǎng)景名字規(guī)則來(lái)推算下一個(gè)需要加載的場(chǎng)景名字,比如M1N1表示(1,1)場(chǎng)景,那你就可以用字符串拆分的方法知道需要讀取M0N0,M1N0,M2N0等等的場(chǎng)景。
4.接下來(lái)就是處理碰撞,獲取下一個(gè)場(chǎng)景(雙場(chǎng)景方式)或者當(dāng)前場(chǎng)景(九宮格方式)的名字,這里你就可以看到一個(gè)被格式化過(guò)的場(chǎng)景名有多么重要。
|
|
1 |
function OnTriggerEnter(other:Collider){ |
2 |
|
3 |
Application.LoadLevel(other.name); //這是雙場(chǎng)景方式直接把邊界Cube名字設(shè)為了下一個(gè)場(chǎng)景名 |
4 |
|
5 |
} |
上面的介紹是大概的描述-具體實(shí)現(xiàn)方法如下
我們?cè)谑褂眠@個(gè)技術(shù)之前要將你的地形--在U3D里的File-Build Setting里登記下場(chǎng)景,才能在腳本里讀取到-Add Current(這個(gè)是登記地形),之后我們來(lái)制作一個(gè)簡(jiǎn)單的-2個(gè)地形的切換方法。
如圖:
Unity3D教程:無(wú)縫地形場(chǎng)景切換的解決方法
這個(gè)圖是做好了的2張地形--中間的Cube是用來(lái)接受角色的碰撞的--這樣我們就知道在何時(shí)去載入我們的下張地形場(chǎng)景了(不包括其他-數(shù)據(jù),列如--坐騎這類的-這個(gè)需要另一段代碼單獨(dú)給坐騎-馬或者車子這類的--還有很多)
Cube---把Inspector--Is Trigger--劃勾--(這個(gè)作用是接受碰撞但不產(chǎn)生能量傳遞-也就是說(shuō)他接受碰撞,但可以讓同樣具有 Is Trigger-劃勾的屬性物體通過(guò)--列入-我們的角色或坐騎)(補(bǔ)充--我們的角色也需要去勾選-Is Trigger-這些才可以通過(guò),但官方自帶的FPS--沒(méi)有Is Trigger-這個(gè)勾選像-可以用如下方法解決-創(chuàng)建一個(gè)新的Cube為他重新命名-把他作為FPS-父物體--然后勾選-Cube的 Is Trigger-子物體就會(huì)有這項(xiàng)屬性了)Unity3D教程手冊(cè):www.unitymanual.com
這些工作建立好了以后-開始我們的腳本工作。
腳本如下:
|
|
01 |
function OnTriggerEnter(other:Collider) |
02 |
|
03 |
{ |
04 |
|
05 |
if (other.gameObject.name==“Cube1”) |
06 |
|
07 |
Application.LoadLevel(“Terrain 1”); |
08 |
|
09 |
}; |
10 |
|
為了方便大家理解--我沒(méi)有重新命名--Cube1--就是我們接受碰撞體,Terrain 1是我們的要載入的下張地形。(大家可以用很多方法去優(yōu)化他--有優(yōu)化的方法請(qǐng)發(fā)在這個(gè)帖子內(nèi)-方便大家查看-非常感謝)
這段代碼要放在角色上或角色攝像機(jī)上或FPS的父物體Cube上。
以上的操作就完成了-一個(gè)重地形0到地形1的切換--(可以解決100M或跟高的內(nèi)存占用問(wèn)題-這個(gè)要看你的地形場(chǎng)景而定了)
但這并不完整--我們也可能要重地形1回到地形0---這個(gè)要你們自己解決了-以上的內(nèi)容已經(jīng)把這個(gè)解決的方法說(shuō)出來(lái)了--大家自己學(xué)習(xí)發(fā)揮下--這樣才有進(jìn)步。
下面我們來(lái)說(shuō)明4張地形場(chǎng)景的載入--邏輯(這里只說(shuō)明邏輯,具體代碼和上方一樣,需要大家自己發(fā)揮下)
如圖 :
Unity3D教程:無(wú)縫地形場(chǎng)景切換的解決方法
這個(gè)圖中可以看到4張地形場(chǎng)景--我重點(diǎn)講解--中間的2個(gè)大的Cube邏輯--那4個(gè)長(zhǎng)方形的大家應(yīng)該都清楚了。除非你沒(méi)認(rèn)真看。
中間***的Cube是來(lái)判斷--角色走的這個(gè)范圍內(nèi)的時(shí)候他要去載入那張地形場(chǎng)景-如果在這個(gè)大的Cube的范圍內(nèi)折載入其他的2張地形場(chǎng)景。(這個(gè)大的Cube可以根據(jù)自己的地形規(guī)格-做出調(diào)整這里給出的并不準(zhǔn)確)
中間最小的Cube是來(lái)判斷--角色走的這個(gè)范圍內(nèi)的時(shí)候他要去載入那張地形場(chǎng)景-如果角色走入小的Cube中后-載入其他3地形。
上面的方法只是--引導(dǎo)--實(shí)際制作中可以跟據(jù)這些方法推敲-這個(gè)4張地形場(chǎng)景同樣少了-往返的-制作介紹--給大家學(xué)習(xí)的空間去發(fā)揮吧。
分享題目:Unity3D無(wú)縫地形場(chǎng)景切換的解決方法
URL標(biāo)題:http://m.fisionsoft.com.cn/article/dpehosj.html


咨詢
建站咨詢
