動態(tài)加載(Dynamic Load)

前言:今天學習動態(tài)加載,雖然在前面的時候也使用過,但沒有系統(tǒng)的學習過,這次系統(tǒng)的學習一下,開始吧 ~


1.加載場景

1.1普通加載

(1)創(chuàng)建兩個場景Scene0101、Scene0102,場景1在(0,0,0)放個Cube,場景2在(1,0,0)放個Sphere

(2)將場景放在Scenes In Build

(2)創(chuàng)建腳本LoadSceneTest

<1>引用UnityEngine.SceneManagement; ? //場景加載的命名空間

1)根據(jù)場景名稱加載場景:SceneManager.LoadScene(場景名字);

2)根據(jù)場景建設索引加載場景:SceneManager.LoadScene(場景建設索引);

3)根據(jù)場景名稱單個加載場景:SceneManager.LoadScene(場景名字,LoadSceneMode.Single);

4)根據(jù)場景建設索引疊加加載場景:SceneManager.LoadScene(場景建設索引,LoadSceneMode.Additive);

<2>引用 UnityEngine;

1)加載時不銷毀對象:DontDestroyOnLoad(對象);

(1)把Cube的標簽設為Player,代碼中是通過查找Player這個標簽來查找不銷毀的對象的

(2)在場景Scene0101中隨意掛載腳本,按A鍵來實現(xiàn)相應的功能

(3)注意事項:

<1>咱們是要切換場景,從Scene0101切換到Scene0102,所以腳本掛載在Scene0101中的任意對象

<2>DotDestroyOnLand在Awake方法中使用

<3>當使用DotDestroyOnLand的時候,不要使用疊加加載場景,會出現(xiàn)重復,所以使用單個加載場景

<4>當使用DontDestroyOnLand轉換場景的時候,對象會進行自動烘焙,材質會變成灰色,還沒學,先不講

1.2異步加載

(1)異步加載:當加載的東西很多的時候,需要一定的時間進行加載,不然會出現(xiàn)卡頓的現(xiàn)象,為了避免這種情況的發(fā)生,我們使用異步加載,就是用一個場景做一個進度條來顯示需要加載的場景的進度,同時這個需要加載的場景也在加載,可以理解為進度條場景和需要加載的場景同時加載

(2)首先創(chuàng)建三個場景Scene0103、Scene0104、Scene0105,Scene0104中創(chuàng)建一個圖片鋪滿整個畫布,再創(chuàng)建一個滑條,去掉滑塊,填充塊(Fill)設為紅色,F(xiàn)ill Area調整到剛好跟Background一樣大,這樣才能看到Fill剛好充滿整個Background

(3)Scene0105中,我們導入環(huán)境包,創(chuàng)建地形,我們去種一些樹

導入環(huán)境包
地形創(chuàng)建

(4)選中地形,選中中樹面板,點擊Edit Trees>>Add Tree

(5)點擊后會彈出Add Tree窗口,把要添加的樹拖到Tree Prefab中,點擊Add

(6)選中地形,多了一個樹的預設體,點擊Mass Place Trees

(7)彈出Place Trees窗口,Number Of Trees設為100,點擊Place

種樹后的畫面

(8)創(chuàng)建腳本Scene3To4

功能:按下A鍵實現(xiàn)切換場景建設索引為3的場景


(9)創(chuàng)建腳本Scene4To5

功能:進度條的Fill每幀填充0.05,異步加載場景建設索引為4的場景

<1>引用UnityEngine;

類:AsyncOperation(異步加載設置參數(shù))

1)AsyncOperation類

1.1)異步加載進度:對象.progress

<2>引用UnityEngine.SceneManagement;

類:SceneManager

1)SceneManager類

1.1)類名.LoadSceneAsync()

有四種重載,跟普通加載場景的參數(shù)一樣,可以對比普通加載的參數(shù),不同點就是一個是普通加載,一個是異步加載

(10)將Scene0103、Scene0104、Scene0105拖到Scenes In Build中,后面的數(shù)字就是對應每個場景的場景建設索引

(11)把腳本Scene3To4掛載到場景Scene0103的隨意對象身上,把腳本Scene4To5掛載到場景Scene0104的隨意對象身上,把Silder拖到腳本Scene4To5中,點擊進入場景Scene0103,點擊運行,點擊Game窗口,按下A鍵,切換到了場景Scene0105中,并打印了異步加載的進度

場景如圖

2.ResourcesTest

(1)創(chuàng)建一個Cube和一個Image,Cube拖到工程目錄中,設為預設體,把場景中的Cube刪除

創(chuàng)建Cube和Images

(2)新建一個Resources文件夾(在使用Resources.Load(對象路徑)的時候會自動尋找Resources文件夾,找它底下的對象路徑),把Cube預設體和一張圖片放到這里拖到此文件夾中,

拖入之后

(3)創(chuàng)建腳本ResourcesTest

功能:按A鍵克隆Cube,按B鍵更換圖片精靈

<1>引用UnityEngine;

類:Resources、GameObject

1)Resources類

1.1)動態(tài)加載對象:類名.Load<對象類型>(對象路徑);

注意:在Resources文件夾下查找對象路徑

2)GameObject類

2.1)查找對象:類名.Find(對象名);

(4)為了方便觀察,我們把Cube預設體的位置設為(0,0,0);并把畫布的Render Mode設為Sreen Space-Camera,主攝像機拖到Render Camera中;Scene窗口菜單中選擇2D

(5)把腳本掛載到隨意對象的身上,點擊運行,按下A鍵,Cube出現(xiàn);按下B鍵,圖片精靈變換

按A鍵,Cube出現(xiàn)
按下B鍵,圖片精靈變換

3.AssetBundle

AssetBundles 可以包括的資源文件有模型文件(models)、材質(materials)、紋理(textures)和場景(scenes)。AssetBundles 不能包含腳本文件。

點擊工程中的文件,在右下角會出現(xiàn)一個預覽窗口,最下面會有這個AssetBundle,默認是None,

這里我們可以新建AssetBundle名字,給它設置打包的路徑,路徑隨便填,

我們可以直接設置路徑(只能小寫,就算你大寫了,它也會自動轉換成小寫),打包的名字隨意發(fā)揮,后綴名也隨意發(fā)揮(注意:如果光寫了代碼,而沒有設置AssetBundle名字,是不能實現(xiàn)打包的)


(1)創(chuàng)建Editor文件夾(在進入編輯器的時候會提前編譯,不需要運行)在它底下創(chuàng)建一個腳本CreateAB

(2)然后就會發(fā)現(xiàn)菜單欄中多了個菜單AB

功能:打包所有設置了AssetBudleName的對象、打包選中的對象、把選中的對象的名字設置為每個對象的AssetBundleName

<1>引用UnityEditor;

類:Editor、MenuItem、BuidPipline、AssetDatabase、AssetBundleBuild、Selection、AssetImporter

1)Editor

2)MenuItem

2.1)創(chuàng)建菜單:[MenuItem(菜單路徑)]

3)BuidPipline

3.1)默認采用LZMA格式進行壓縮,壓縮率較大:類名.BuildAssetBundles(輸出路徑,BuildAssetBundleOptions.None,打包的平臺);

3.2)采用LZ4進行壓縮,基于Chunk算法,壓縮率較小:類名.BuildAssetBundles(輸出路徑,BuildAssetBundleOptions.ChunkBasedCompression,打包的平臺);

3.3)不壓縮,資源最大,但是訪問速度最快:類名.BuildAssetBundles(輸出路徑,BuildAssetBundleOptions.UncompressedAssetBundle,打包的平臺);

3.4)強制進行重新打包:類名.BuildAssetBundles(輸出路徑,BuildAssetBundleOptions.ForceRebuildAssetBundle,打包的平臺);

3.5)類名.BuildAssetBundles(輸出路徑,AssetBundle設置對象,打包格式,打包的平臺);

注意:打包格式跟前面的幾個一樣,也是四種

4)AssetDatabase

4.1)刷新:類名.Refresh();

4.2)獲取對象的絕對路徑:類名.GetAssetPath(對象);

5)AssetBundleBuild

5.1)AssetBundle壓縮包的名字:類名[i].assetBundleName=名字;

6)Selection

6.1)鼠標選中的對象:類名.objects

7)AssetImporter

7.1)得到路徑:類名.GetAtPath(路徑)

7.2)對象的AssetBundle名字:對象.assetBundleName

7.3)保存并且重新導入對象:對象.SaveAndReimport();

<2>注意:

? ? ? ? 1)打包方式單一

? ? ? ? 2)具有相同名字的資源,會打到一個Bundle當中

? ? ? ? 3).manifest是bundle的配置文件,

? ? ? ? 4)每一個bundle都有這樣一個配置文件,通過它可以查看每個bundle中的版本、hash、資源和依賴等信息,

? ? ? ? 還有一個總的配置文件(與打包的輸出目錄重名),通過總的配置文件,可以查看一個有多少個bundle包和每個bundle的信息

? ? ? ? 5)資源沒變的bundle,不會觸發(fā)重新打包,即使bundle刪除了也不會重新打包,但是配置文件丟失會觸發(fā)重新打包

(2)打包路徑對應:工程目錄下路徑對應代碼中的路徑

(3)我們回到Unity編輯器中,由于Editor文件夾是個特殊的文件夾,它里面的代碼,Unity編輯器會提前編譯,所以我們當我們轉到Unity編輯器的時候代碼就編譯好了,也就出現(xiàn)了AB這個我們代碼中寫的一個編輯器擴展的菜單,菜單的內容對應著代碼中的菜單1、2、3,實現(xiàn)相應的功能。第一個是打包所有設置了AssetBudle名字的對象、第二個是打包選中的對象,并把它們的AssetBundle名字改為custom、第三個是把選中的對象的名字設置為每個對象的AssetBundle名字


<1>選中BuildAll,會打包所有的設置了AssetBundle名字的對象,在打包路徑下會多出它們的AssetBundle包和對應的配置文件,以及路徑文件和路徑文件配置文件

1)AssetBundle包:資源的壓縮包

2)AssetBundle包的配置文件:有HashID(32位)、Assets(資源絕對路徑,真正的名字)、Dependencies(依賴關系)

3)路徑文件:跟路徑文件夾相同名字的文件(白色的)

4)路徑文件的配置文件:跟路徑文件夾相同名字的文件(黑色的),對應打包的所有對象的AssetBundleName(AssetBundle名字)、Dependencies(AssetBundle的依賴)

<2>第二個是打包選中的對象,并把它們的AssetBundle壓縮包的名字改為custom

選中一個對象打包
選中多個對象打包

<3>第三個是把選中的對象的名字設置為每個對象的AssetBundle名字

默認狀態(tài)
點擊菜單之后

(4)依賴關系

把依賴的關系和依賴本體分開打包,可以節(jié)省內存空間。如果都放在本體中打包,每個本體也需要把相應的依賴關系一起打包,如果很多個本體都需要相同的依賴關系,就得打包多次依賴關系,很占內存,所以我們采取分開打包的方式,把本體和依賴關系分開打包,當多個本體都需要同一個依賴關系的時候,我們只需要打包這一個依賴關系即可

<1>如果使用默認材質球,則沒有依賴關系

<2>把mat材質球和Sphere1設置AssetBundle先SetABName然后BuildAll(BuildAl只打包設置了AssetBundle名字的對象)

<3>查看Sphere1對象的AssetBundle壓縮包文件,在里面看到sphere1和mat文件大小差不多大

<4>現(xiàn)在我們把mat材質球拖給Sphere1對象,讓它依賴mat,再次打包

<5>存在依賴關系之后,我們再打包之后,發(fā)現(xiàn)sphere1的AssetBundle壓縮包文件大小變成了2KB,mat還是那么多,說明當我們讓Sphere1對象依賴mat后,我們再對sphere1和mat打包,它們是分開打包的


最后:今天的內容就到這里,不過內容還沒有學習完,明天會繼續(xù)~期待相~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,431評論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,637評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,555評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,900評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,629評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,976評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,976評論 3 448
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,139評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 49,686評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,411評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,641評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,129評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,820評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,233評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,567評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,362評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,604評論 2 380

推薦閱讀更多精彩內容