• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            麒麟子

            ~~

            導(dǎo)航

            <2010年5月>
            2526272829301
            2345678
            9101112131415
            16171819202122
            23242526272829
            303112345

            統(tǒng)計(jì)

            常用鏈接

            留言簿(12)

            隨筆分類

            隨筆檔案

            Friends

            WebSites

            積分與排名

            最新隨筆

            最新評論

            閱讀排行榜

            評論排行榜

            Unity3d之無縫地形場景切換–解決方法和代碼

            當(dāng)我們開發(fā)一個(gè)大型項(xiàng)目的時(shí)候-會(huì)遇到這樣的問題(地形場景的切換)這個(gè)只是字面意思-并不是重場景1的100 100 100坐標(biāo)一下切換到場景2的100 100 100坐標(biāo)這樣的方法--(如果您以為是這樣的技術(shù)和代碼)那就不用看了。這個(gè)技術(shù)的實(shí)質(zhì)意義是為了解決--多地形場景帶來的大量內(nèi)存占用問題-舉個(gè)我的例子-我的測試項(xiàng)目是1013張繪制地形--在不用上面的技術(shù)情況下-占用了我4.2G的內(nèi)存。想想下-如果一個(gè)大型的游戲直接這么運(yùn)行的話)一下就會(huì)帶來5-8G的內(nèi)存占用--這個(gè)游戲還能玩嗎?

            下面讓我們來研究實(shí)現(xiàn)的方法和代碼

            涉及到幾個(gè)U3D函數(shù):(引用高人的文檔介紹)

            Application.LoadLevel(lv)   場景讀取(記著用多場景前要現(xiàn)在File-Build Setting里登記下場景,才能在腳本里讀取到) DontDestroyOnLoad(object)  保持物體在場景切換的時(shí)候不被卸載(能保持他的所有屬性哦)

            *AssetBundle 類       預(yù)讀資源(主要用于web3d,運(yùn)行時(shí)實(shí)時(shí)從服務(wù)器下載需要的場景資源)

            涉及到幾個(gè)基礎(chǔ)知識:

            static 靜態(tài)類、靜態(tài)變量:在整個(gè)游戲中都不會(huì)被重新加載,所以可以當(dāng)全局全場景變量使用,主要用于記錄場景數(shù)組。

            Collider的Is Trigger屬性:設(shè)置成True,他是可以穿越不會(huì)產(chǎn)生能量傳遞的,但是,他是可以接受碰撞偵測的。配合主角的OnTriggerEnter事件,就可以知道你是否正在穿越一個(gè)Trigger了。在這里,我們用在判斷何時(shí)加載新場景上。

            2.制作場景邊界

            使用Cube + IsTrigger=True屬性是最好的辦法。

            1)如果是雙場景切換,注意兩個(gè)場景邊界坐標(biāo)別重在一起,不然你走到邊界會(huì)發(fā)現(xiàn)兩個(gè)邊界不停的切換=.=,要讓2個(gè)場景邊界互相交錯(cuò)一起(做的時(shí)候你自然會(huì)明白)。有必要的話,邊界可以往里面縮一點(diǎn)(甚至可以吧場景重疊1/3,但這樣兩個(gè)場景你要做很多重復(fù)的東西),避免用戶看到邊界。然后建議是把Cube

            3.編寫腳本

            好了,現(xiàn)在可以開始寫腳本了,我一如既往的很懶,所以不會(huì)吧全部代碼粘帖出來 。(我會(huì)別看到這里不看了,這是以前高人寫的)

            先理清楚邏輯關(guān)系以及一些常識:

            1.是主攝像機(jī)走到邊界才會(huì)做場景加載或卸載動(dòng)作。所以代碼是放在主攝像機(jī)上或者主角上。

            2.場景可以加載,但是沒有卸載場景這個(gè)東西(也沒必要卸載,因?yàn)橥粫r(shí)間只會(huì)有一個(gè)場景為當(dāng)前場景),所以如果你用九宮格方式做無縫連接,你需要把場景讀取,然后讓場景里所有物體DontDestroyOnLoad(當(dāng)然包括主角,也就是this),然后其他場景也這么操作,當(dāng)需要卸載場景時(shí),只要把所有那個(gè)場景Object給Destroy掉就可以了。而做雙場景連接則不需要這樣,也簡單的多。

            3.如果是九宮格,你需要一個(gè)靜態(tài)二維數(shù)組去記錄每個(gè)位置場景的名字。這里也可以不需要這么做,有個(gè)技巧,你可以格式化場景名字規(guī)則來推算下一個(gè)需要加載的場景名字,比如M1N1表示(1,1)場景,那你就可以用字符串拆分的方法知道需要讀取M0N0,M1N0,M2N0等等的場景。

            4.接下來就是處理碰撞,獲取下一個(gè)場景(雙場景方式)或者當(dāng)前場景(九宮格方式)的名字,這里你就可以看到一個(gè)被格式化過的場景名有多么重要。

            function OnTriggerEnter(other:Collider){

            Application.LoadLevel(other.name); //這是雙場景方式直接把邊界Cube名字設(shè)為了下一個(gè)場景名

            }

            上面的介紹是大概的描述-具體實(shí)現(xiàn)方法如下

            我們在使用這個(gè)技術(shù)之前要將你的地形--在U3D里的File-Build Setting里登記下場景,才能在腳本里讀取到-Add Current(這個(gè)是登記地形)

            之后我們來制作一個(gè)簡單的-2個(gè)地形的切換方法

            如圖:

            這個(gè)圖是做好了的2張地形--中間的Cube是用來接受角色的碰撞的--這樣我們就知道在何時(shí)去載入我們的下張地形場景了(不包括其他-數(shù)據(jù)。。列入--坐騎這類的-這個(gè)需要另一段代碼單獨(dú)給坐騎-馬或者車子這類的--還有很多)

            Cube---把Inspector--Is Trigger--劃勾--(這個(gè)作用是接受碰撞但不產(chǎn)生能量傳遞-也就是說他接受碰撞,但可以讓同樣具有 Is Trigger-劃勾的屬性物體通過--列入-我們的角色或坐騎)(補(bǔ)充--我們的角色也需要去勾選-Is Trigger-這些才可以通過,但官方自帶的FPS--沒有Is Trigger-這個(gè)勾選像-可以用如下方法解決-創(chuàng)建一個(gè)新的Cube為他重新命名-把他作為FPS-父物體--然后勾選-Cube的 Is Trigger-子物體就會(huì)有這項(xiàng)屬性了)

            這些工作建立好了以后-開始我們的腳本工作。

            腳本如下:

            function OnTriggerEnter(other:Collider)

            {

            if (other.gameObject.name=="Cube1")

            Application.LoadLevel("Terrain 1");

            };

            復(fù)制代碼

            為了方便大家理解--我沒有重新命名--Cube1--就是我們接受碰撞體,Terrain 1是我們的要載入的下張地形。(大家可以用很多方法去優(yōu)化他--有優(yōu)化的方法請發(fā)在這個(gè)帖子內(nèi)-方便大家查看-非常感謝)

            這段代碼要放在角色上或角色攝像機(jī)上或FPS的父物體Cube上。

            以上的操作就完成了-一個(gè)重地形0到地形1的切換--(可以解決100M或跟高的內(nèi)存占用問題-這個(gè)要看你的地形場景而定了)

            但這并不完整--我們也可能要重地形1回到地形0---這個(gè)要你們自己解決了-以上的內(nèi)容已經(jīng)把這個(gè)解決的方法說出來了--大家自己學(xué)習(xí)發(fā)揮下--這樣才有進(jìn)步。

            下面我們來說明4張地形場景的載入--邏輯(這里只說明邏輯,具體代碼和上方一樣,需要大家自己發(fā)揮下)

            如圖

            這個(gè)圖中可以看到4張地形場景--我重點(diǎn)講解--中間的2個(gè)大的Cube邏輯--那4個(gè)長方形的大家應(yīng)該都清楚了。除非你沒認(rèn)真看。

            中間最大的Cube是來判斷--角色走的這個(gè)范圍內(nèi)的時(shí)候他要去載入那張地形場景-如果在這個(gè)大的Cube的范圍內(nèi)折載入其他的2張地形場景。(這個(gè)大的Cube可以根據(jù)自己的地形規(guī)格-做出調(diào)整這里給出的并不準(zhǔn)確)

            中間最小的Cube是來判斷--角色走的這個(gè)范圍內(nèi)的時(shí)候他要去載入那張地形場景-如果角色走入小的Cube中后-載入其他3地形。

            原文鏈接:http://keigoliye.blog.163.com/blog/static/146213359201081923658957/

            posted on 2013-02-22 22:52 麒麟子 閱讀(3181) 評論(0)  編輯 收藏 引用

            99久久夜色精品国产网站| 久久国产亚洲精品麻豆| 女人高潮久久久叫人喷水| 久久久久久久免费视频| 亚洲精品国产字幕久久不卡| 99久久精品国产麻豆| 久久伊人影视| 精品国产VA久久久久久久冰| 久久99精品久久久久久不卡| 亚洲国产精品无码久久一线| 精品综合久久久久久88小说 | 久久久亚洲裙底偷窥综合| 99久久精品国产麻豆| 久久精品国产色蜜蜜麻豆| 99久久免费国产精品热| 成人综合久久精品色婷婷| 久久精品国产99国产电影网| 亚洲欧美久久久久9999| 国产精品毛片久久久久久久 | 久久久精品久久久久特色影视| 久久精品亚洲AV久久久无码| 国产香蕉97碰碰久久人人| 久久国产欧美日韩精品| 久久精品国产AV一区二区三区| 国产成人精品久久综合 | 久久久女人与动物群交毛片| 久久亚洲高清综合| 久久精品国产99国产精品澳门| 色婷婷综合久久久中文字幕| 精品综合久久久久久97| 国产精品亚洲综合久久| 久久免费视频1| 亚洲精品成人网久久久久久| 欧美与黑人午夜性猛交久久久| 66精品综合久久久久久久| 精品人妻久久久久久888| 日韩人妻无码一区二区三区久久| 国产69精品久久久久9999APGF| 99精品国产免费久久久久久下载| 久久人人爽人人爽人人片AV麻烦| 久久人人爽人人爽人人片AV东京热 |