Unity3D教程 無縫地形場景切換的解決方法

2022-06-18 10:42:11 字數 2956 閱讀 5383

當我們開發乙個大型專案的時候-會遇到這樣的問題(地形場景的切換)這個只是字面意思-並不是重場景1的100  100 100座標一下切換到場景2的100 100 100座標這樣的方法--(如果您以為是這樣的技術和**)那就不用看了。這個技術的實質意義是為了解決--多地形場景帶來的大量記憶體占用問題-舉個我的例子-我的測試專案是1013張繪製地形--在不用上面的技術情況下-占用了我4.2g的記憶體(還好我電腦16g)想想下-如果乙個大型的遊戲直接這麼執行的話(當然是不可能會這樣傻的)一下就會帶來5-8g的記憶體占用--這個遊戲還能玩嗎?(當然這個8g的占用記憶體也沒換來他應該的效果,所以是浪費)

涉及到幾個u3d函式:

dontdestroyonload(object):保持物體在場景切換的時候不被解除安裝(能保持他的所有屬性哦)

涉及到幾個基礎知識:

collider的is trigger屬性:設定成true,他是可以穿越不會產生能量傳遞的,但是,他是可以接受碰撞偵測的。配合主角的ontriggerenter事件,就可以知道你是否正在穿越乙個trigger了。在這裡,我們用在判斷何時載入新場景上。

2.製作場景邊界

使用cube + istrigger=true屬性是最好的辦法。

如果是雙場景切換,注意兩個場景邊界座標別重在一起,不然你走到邊界會發現兩個邊界不停的切換=.=,要讓2個場景邊界互相交錯一起。有必要的話,邊界可以往裡面縮一點(甚至可以吧場景重疊1/3,但這樣兩個場景你要做很多重複的東西),避免使用者看到邊界。

3.編寫指令碼

先理清楚邏輯關係以及一些常識:

1.是主攝像機走到邊界才會做場景載入或解除安裝動作。所以**是放在主攝像機上或者主角上。

2.場景可以載入,但是沒有解除安裝場景這個東西(也沒必要解除安裝,因為同一時間只會有乙個場景為當前場景),所以如果你用九宮格方式做無縫連線,你需要把場景讀取,然後讓場景裡所有物體dontdestroyonload(當然包括主角,也就是this),然後其他場景也這麼操作,當需要解除安裝場景時,只要把所有那個場景object給destroy掉就可以了。而做雙場景連線則不需要這樣,也簡單的多。unity3d教程手冊:www.unitymanual.com

3.如果是九宮格,你需要乙個靜態二維陣列去記錄每個位置場景的名字。這裡也可以不需要這麼做,有個技巧,你可以格式化場景名字規則來推算下乙個需要載入的場景名字,比如m1n1表示(1,1)場景,那你就可以用字串拆分的方法知道需要讀取m0n0,m1n0,m2n0等等的場景。

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

1

function ontriggerenter(other:collider)

上面的介紹是大概的描述-具體實現方法如下

我們在使用這個技術之前要將你的地形--在u3d裡的file-build setting裡登記下場景,才能在指令碼裡讀取到-add current(這個是登記地形),之後我們來製作乙個簡單的-2個地形的切換方法。

如圖:

unity3d教程:無縫地形場景切換的解決方法

這個圖是做好了的2張地形--中間的cube是用來接受角色的碰撞的--這樣我們就知道在何時去載入我們的下張地形場景了(不包括其他-資料,列如--坐騎這類的-這個需要另一段**單獨給坐騎-馬或者車子這類的--還有很多)

cube---把inspector--is trigger--劃勾--(這個作用是接受碰撞但不產生能量傳遞-也就是說他接受碰撞,但可以讓同樣具有 is trigger-劃勾的屬性物體通過--列入-我們的角色或坐騎)(補充--我們的角色也需要去勾選-is trigger-這些才可以通過,但官方自帶的fps--沒有is trigger-這個勾選像-可以用如下方法解決-建立乙個新的cube為他重新命名-把他作為fps-父物體--然後勾選-cube的 is trigger-子物體就會有這項屬性了)unity3d教程手冊:www.unitymanual.com

這些工作建立好了以後-開始我們的指令碼工作。

指令碼如下:

01

function ontriggerenter(other:collider)
02

03

;

10

為了方便大家理解--我沒有重新命名--cube1--就是我們接受碰撞體,terrain 1是我們的要載入的下張地形。(大家可以用很多方法去優化他--有優化的方法請發在這個帖子內-方便大家檢視-非常感謝)

這段**要放在角色上或角色攝像機上或fps的父物體cube上。

以上的操作就完成了-乙個重地形0到地形1的切換--(可以解決100m或跟高的記憶體占用問題-這個要看你的地形場景而定了)

但這並不完整--我們也可能要重地形1回到地形0---這個要你們自己解決了-以上的內容已經把這個解決的方法說出來了--大家自己學習發揮下--這樣才有進步。

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

如圖 :

unity3d教程:無縫地形場景切換的解決方法

這個圖中可以看到4張地形場景--我重點講解--中間的2個大的cube邏輯--那4個長方形的大家應該都清楚了。除非你沒認真看。

中間最大的cube是來判斷--角色走的這個範圍內的時候他要去載入那張地形場景-如果在這個大的cube的範圍內折載入其他的2張地形場景。(這個大的cube可以根據自己的地形規格-做出調整這裡給出的並不準確)

中間最小的cube是來判斷--角色走的這個範圍內的時候他要去載入那張地形場景-如果角色走入小的cube中後-載入其他3地形。

上面的方法只是--引導--實際製作中可以跟據這些方法推敲-這個4張地形場景同樣少了-往返的-製作介紹--給大家學習的空間去發揮吧。

Unity3D學習之地形的建立

unity3d學習 首先在flie 檔案 建立新創景now scene 然後單擊create選中terrian 地形 單擊這樣就建立出新地形,可以再場景欄中看見。接下來介紹一下terrian屬性中的transform元件。position 可以改變地形的的立體空間位置。rotation 可以改變地形...

Unity3D嵌入WPF教程

建立乙個 類庫工程 新增 windowform 使用者控制項 usercontrol 1 引入 untiywebplayer com 元件 在工具 選擇工具箱中找到unitywebplayer.dll並新增 2 在使用者控制項中新增unitywedplayer控制項 在工具箱中直接拖拉即可 2 將 ...

Unity3D教程之Light光源

燈光用來照亮場景和物件,可以創造完美的視覺氣氛。燈光可以用來模擬太陽 燃燒的火柴 探照燈 手電筒 槍火光 等等。我們通過在hierarchy面板 create light來建立4種不同的燈光效果。如圖1 10所示。四種型別的燈光 directional light平行光 方向光 最省資源 可以改變角...