前言:今天學習動態(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)建地形,我們去種一些樹
(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刪除
(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鍵,圖片精靈變換
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名字
(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ù)~期待相~