動(dòng)態(tài)加載(Dynamic Load)

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


1.加載場景

1.1普通加載

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

(2)將場景放在Scenes In Build

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

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

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

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

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

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

<2>引用 UnityEngine;

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

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

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

(3)注意事項(xiàng):

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

<2>DotDestroyOnLand在Awake方法中使用

<3>當(dāng)使用DotDestroyOnLand的時(shí)候,不要使用疊加加載場景,會(huì)出現(xiàn)重復(fù),所以使用單個(gè)加載場景

<4>當(dāng)使用DontDestroyOnLand轉(zhuǎn)換場景的時(shí)候,對象會(huì)進(jìn)行自動(dòng)烘焙,材質(zhì)會(huì)變成灰色,還沒學(xué),先不講

1.2異步加載

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

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

(3)Scene0105中,我們導(dǎo)入環(huán)境包,創(chuàng)建地形,我們?nèi)シN一些樹

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

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

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

(6)選中地形,多了一個(gè)樹的預(yù)設(shè)體,點(diǎn)擊Mass Place Trees

(7)彈出Place Trees窗口,Number Of Trees設(shè)為100,點(diǎn)擊Place

種樹后的畫面

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

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


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

功能:進(jìn)度條的Fill每幀填充0.05,異步加載場景建設(shè)索引為4的場景

<1>引用UnityEngine;

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

1)AsyncOperation類

1.1)異步加載進(jìn)度:對象.progress

<2>引用UnityEngine.SceneManagement;

類:SceneManager

1)SceneManager類

1.1)類名.LoadSceneAsync()

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

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

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

場景如圖

2.ResourcesTest

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

創(chuàng)建Cube和Images

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

拖入之后

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

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

<1>引用UnityEngine;

類:Resources、GameObject

1)Resources類

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

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

2)GameObject類

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

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

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

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

3.AssetBundle

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

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

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

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


(1)創(chuàng)建Editor文件夾(在進(jìn)入編輯器的時(shí)候會(huì)提前編譯,不需要運(yùn)行)在它底下創(chuàng)建一個(gè)腳本CreateAB

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

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

<1>引用UnityEditor;

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

1)Editor

2)MenuItem

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

3)BuidPipline

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

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

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

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

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

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

4)AssetDatabase

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

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

5)AssetBundleBuild

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

6)Selection

6.1)鼠標(biāo)選中的對象:類名.objects

7)AssetImporter

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

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

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

<2>注意:

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

? ? ? ? 2)具有相同名字的資源,會(huì)打到一個(gè)Bundle當(dāng)中

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

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

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

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

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

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


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

1)AssetBundle包:資源的壓縮包

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

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

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

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

選中一個(gè)對象打包
選中多個(gè)對象打包

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

默認(rèn)狀態(tài)
點(diǎn)擊菜單之后

(4)依賴關(guān)系

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

<1>如果使用默認(rèn)材質(zhì)球,則沒有依賴關(guān)系

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

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

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

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


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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容