Unity3D開發(fā)標(biāo)準(zhǔn)教程-游戲資源更新_第1頁
Unity3D開發(fā)標(biāo)準(zhǔn)教程-游戲資源更新_第2頁
Unity3D開發(fā)標(biāo)準(zhǔn)教程-游戲資源更新_第3頁
Unity3D開發(fā)標(biāo)準(zhǔn)教程-游戲資源更新_第4頁
Unity3D開發(fā)標(biāo)準(zhǔn)教程-游戲資源更新_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

第1頁游戲資源更新第2頁10.1 初識AssetBundleAssetBundle是將資源用Unity提供的一種用于存儲資源的壓縮格式打包后的集合,它是對資源管理的一個擴展,可以動態(tài)的加載和卸載,并且大大節(jié)約了游戲所占的空間,即使是已經(jīng)發(fā)布的游戲也可以用其來增加新的內(nèi)容。一般情況下,AssetBundle的開發(fā)流程具體步驟如下:(1)創(chuàng)建AssetBundle:開發(fā)者在Unity編輯器中通過腳本來將所需的資源打包成AssetBundle文件。(2)上傳至服務(wù)器:開發(fā)者創(chuàng)建好AssetBundle文件后,可通過上傳工具將其上傳到游戲的服務(wù)器中,使游戲客戶端可以通過訪問服務(wù)器來獲取當(dāng)前所需要的資源,進而實現(xiàn)游戲的更新。第3頁10.1 初識AssetBundle(3)下載AssetBundle:游戲在運行時,客戶端會將服務(wù)器上傳的游戲更新所需的AssetBundle下載到本地設(shè)備中,再通過加載模塊將資源加載到游戲中。Unity提供了相應(yīng)的API可供使用來完成從服務(wù)器端下載AssetBundle。(4)加載AssetBundle:AssetBundle文件下載成功后,開發(fā)者通過Unity提供的API可以加載資源包里所包含的模型、紋理圖、音頻、動畫、場景等,并將其實例化來更新游戲客戶端。(5)卸載AssetBundle:在Unity中提供了相應(yīng)的方法來卸載AssetBundle,卸載AssetBundle可以節(jié)約內(nèi)存資源,并且保證資源的正常更新。第4頁10.2AssetBundle的基本使用10.2.1 AssetBundle的打包1. AssetBundle系統(tǒng)新建一個項目并命名為“BNUAssetBunds”,點擊GameObject→3DObject→Cube,然后在Assets窗口創(chuàng)建一個Prefab,并命名為“Cubeasset”,然后將剛剛創(chuàng)建好的Cube拖拽到Cubeasset上,如圖10-1所示。圖10-1創(chuàng)建cubeasset預(yù)制件第5頁10.2AssetBundle的基本使用10.2.1 AssetBundle的打包1. AssetBundle系統(tǒng)然后單擊剛剛創(chuàng)建好的預(yù)制件Cubeasset,在Inspector面板底部有AssetBundle的創(chuàng)建工具,如圖10-2所示。接下來創(chuàng)建AssetBundle,空的AssetBundles可以通過點擊菜單選項“New…”來創(chuàng)建,將其命名為“cubeb”,如圖10-3所示。

圖10-2AssetBundle創(chuàng)建工具 圖10-3將對象的AssetBundle命名cubeb第6頁10.2AssetBundle的基本使用10.2.1 AssetBundle的打包2. BuildAssetBundles方法1 publicstaticAssetBundleMainfestBuildAssetBundles(stringoutputPath,BuildAssetBundleOptions2assetBundleOptions=BuildAssetBundleOption.None,BuildTargettargetPlatfom=BuildTarget.WebPlayer);

說明:上述聲明中參數(shù)含義中“OutPath”參數(shù)為AssetBundls的輸出路徑,一般情況下為Assets下的某一個文件夾。

第7頁10.2AssetBundle的基本使用10.2.1 AssetBundle的打包右鍵單擊Create→Folder創(chuàng)建一個文件夾,并命名為“C#”,然后在C#文件夾下右鍵單擊Create→C#Script,并命名為“BNUBuildAsset”,雙擊腳本編寫代碼來將上面創(chuàng)建的cubeasset打包成AssetBundles并將其導(dǎo)出,具體實現(xiàn)如下面代碼片段所示1 usingUnityEngine;2 usingSystem.Collections;3 usingUnityEditor; //導(dǎo)入系統(tǒng)相關(guān)類4 publicclassBNUBuildAsset:MonoBehaviour{5 [MenuItem("Test/BuildAssetBundles")] //添加菜單欄"Test"以及子菜單"BuildAssetBundles"6 staticvoidBuildAssetBundles(){ //聲明BuildAssetBundles方法7 //將資源打包到本項目中的Assetbundle文件夾下,并設(shè)置為未壓縮格式8 BuildPipeline.BuildAssetBundles(Application.dataPath+"/Assetbundle",9 BuildAssetBundleOptions.None,BuildTarget.StandaloneWindows64);10 }}

第8頁10.2AssetBundle的基本使用10.2.1 AssetBundle的打包此腳本編寫完后并不需要掛載到對象或者主攝像機上,編寫完成后會在菜單欄自動生成“Test”項,如圖10-4所示。單擊其子菜單“BuildAssetBundles”,完成AssetBundle的打包,打包完成后會在AssetBundle文件夾下生成相關(guān)文件,如圖10-5所示。

圖10-4生成Test菜單 圖10-5AssetBundle打包文件第9頁10.2AssetBundle的基本使用10.2.1 AssetBundle的打包每一個AssetBundle資源將會有一個和原文件相關(guān)的“.mainfest”的文本類型的文件,該文件提供了所打包資源的CRC和資源依賴的信息,比如本案例中的Cubeasset打包成的“cubeb.mainfest”文件,如圖10-6所示。

圖10-6AssetBundle打包文件第10頁10.2AssetBundle的基本使用10.2.2 下載AssetBundle1. 非緩存機制非緩存機制通過創(chuàng)建一個WWW實例來下載AssetBundle文件。采用此種方式下載AssetBundle的文件不會存入Unity引擎的緩存區(qū)。

3 publicclassBNUDownoad:MonoBehaviour{4 publicstringBundleURL; //定義URL字符串5 publicstringAssetName; //定義資源名字字符串6 IEnumeratorStart(){7 using(WWWwww=newWWW(BundleURL)){//創(chuàng)建一個網(wǎng)頁鏈接請求,并賦給www8 yieldreturnwww; //返回www的值9 if(www.error!=null) //如果下載過程中出現(xiàn)錯誤10 Debug.Log("WWWdownloadhadanerror:"+www.error);//打印錯誤的提示信息11 AssetBundlebundle=www.assetbundle; //下載AssetBundle12 if(AssetName=="") //如果沒有指定具體的資源名字13 Instantiate(bundle.mainAsset); //實例化主資源14 else15 Instantiate(bundle.LoadAsset(AssetName)); //否則實例化指定名字的資源16 bundle.Unload(false); //釋放bundle的序列化數(shù)據(jù)

第11頁10.2AssetBundle的基本使用10.2.2 下載AssetBundle2. 緩存機制緩存機制通過WWW類下的LoadFromCacheOrDownload接口來實現(xiàn)AssetBundle的下載。通過緩存機制下載的AssetBundle會被存儲在Unity的本地緩存區(qū)中。Unity提供的默認(rèn)緩存大小在不同平臺上也有所不同,在WebPlayer平臺上發(fā)布的網(wǎng)頁游戲默認(rèn)緩存大小為50MB;在PC客戶端發(fā)布的游戲和在iOS/Android平臺上發(fā)布移動游戲默認(rèn)緩存大小為4GB。4 publicclassBNUDownloadasset:MonoBehaviour{5 publicstringBundleURL; //定義URL字符串6 publicstringAssetName; //定義資源名字字符串7 publicintversion; //定義版本號8 voidStart(){9 StartCoroutine(DownloadAndCache()); //開始緩存機制下載協(xié)同程序10 }

第12頁10.2AssetBundle的基本使用10.2.2 下載AssetBundle2. 緩存機制11 IEnumeratorDownloadAndCache(){12 while(!Caching.ready) //如果換成沒準(zhǔn)備好13 yieldreturnnull; //返回空對象14 using(WWWwww=WWW.LoadFromCacheOrDownload(BundleURL,version)){15 //創(chuàng)建一個網(wǎng)頁鏈接請求,并賦給www16 yieldreturnwww;//返回www17 if(www.error!=null)//如果下載過程中出現(xiàn)錯誤18 thrownewException("WWWdownloadhadanerror:"+www.error);//拋出異常19 AssetBundlebundle=www.assetbundle; //下載AssetBundle20 if(AssetName=="") //如果未指定打包的資源21 Instantiate(bundle.mainAsset); //實例化主資源22 else23 Instantiate(bundle.LoadAsset(AssetName)); //否則實例化指定資源24 bundle.Unload(false); //釋放bundle的序列化數(shù)據(jù)25 }}}

第13頁10.2AssetBundle的基本使用10.2.3 AssetBundle的加載和卸載AssetBundle下載完成后,并不能直接被使用,需要將AssetBundle加載到內(nèi)存中并且創(chuàng)建成具體的文件對象,這個過程就是AssetBundle的加載,需要開發(fā)者編寫代碼實現(xiàn)。

1. 如何加載AssetBundleUnity提供了三種不同的方法來從已經(jīng)下載的數(shù)據(jù)中加載AssetBundleAssetBundle.LoadAssetAssetBundle.LoadAssetAsyncAssetBundle.LoadAllAssets下面編寫腳本來加載AssetBundle,在C#文件夾下右鍵單擊Create→C#Script創(chuàng)建一個腳本,并命名為“BNULoadAsset”,雙擊腳本編寫代碼進行編寫,具體實現(xiàn)如下面的代碼片段所示。

第14頁10.2AssetBundle的基本使用10.2.3 AssetBundle的加載和卸載1 usingUnityEngine;2 usingSystem.Collections; //導(dǎo)入系統(tǒng)相關(guān)類3 publicclassBNULoadAsset:MonoBehaviour{4 voidOnGUI(){ //聲明OnGUI方法5 if(GUILayout.Button("LoadAssetbundle")){ //創(chuàng)建加載AssetBundle按鈕,并判斷是否被按下6 AssetBundlemanifestBundle=AssetBundle.CreateFromFile(Application.dataPath7 +"/Assetbundle/AssetBundle"); //首先加載Manifest文件;8 if(manifestBundle!=null){ //如果Mainfest文件不為空9 AssetBundleManifestmanifest=(AssetBundleManifest)manifestBundle.LoadAsset(10 "AssetBundleManifest"); //加載主資源文件的AssetBundle11 AssetBundlecubeBundle=AssetBundle.CreateFromFile(Application.dataPath12 +"/Assetbundle/cubeb"); //加載cube對象的AssetBundle13 GameObjectcube=cubeBundle.LoadAsset("Cube")asGameObject; //獲取cube對象14 if(cube!=null){15 Instantiate(cube); //實例化cube16 }}}}}

第15頁10.2AssetBundle的基本使用10.2.3 AssetBundle的加載和卸載點擊運行按鈕之后,案例的運行效果會顯示在Game窗口中,在屏幕的左上角有一個加載AssetBundle資源的按鈕,如圖10-7所示。單擊按鈕,在窗口中會出現(xiàn)實例化的cube對象,并且在左側(cè)的層次結(jié)構(gòu)中也有顯示,如圖10-8所示。

圖10-7案例運行效果 10-8實例化cube對象第16頁10.2AssetBundle的基本使用10.2.3 AssetBundle的加載和卸載2. AssetBundle的卸載

AssetBundle.Unload(flase)說明:false是指釋放AssetBundle文件的內(nèi)存鏡像,不包含Load創(chuàng)建的Asset內(nèi)存對象。

AssetBundle.Unload(true)說明:true是釋放那個AssetBundle文件內(nèi)存鏡像和并銷毀所有用Load創(chuàng)建的Asset內(nèi)存對象。

第17頁10.3 AssetBundle相關(guān)知識10.3.1 管理依賴如果一個共享的依賴資源被包含在每一個使用它的對象中,那么當(dāng)這些對象被打包時,此部分共享的資源就會被多次打包,這樣會造成內(nèi)存的浪費。為了避免這種浪費,需要將共享的資源打包到一個單獨的AssetBundle中,然后讓兩個模型所隸屬的AssetBundle分別依賴于該AssetBundle。

第18頁10.3 AssetBundle相關(guān)知識10.3.2儲存和加載二進制文件下面是一個在AssetBundle中存儲和加載二進制數(shù)據(jù)的案例1 usingUnityEngine;2 usingSystem.Collections;3 publicclassBNUBinarydata:MonoBehaviour{4 stringurl="/mygame/assetbundles/assetbundle1.unity3d"; 5 //定義url字符串6 IEnumeratorStart(){7 WWWwww=WWW.LoadFromCacheOrDownload(url,1);//通過所給的URL開始一個下載8 yieldreturnwww; //等待下載完成9 AssetBundlebundle=www.assetBundle; //加載并且取回AssetBundle10 TextAssettxt=bundle.LoadAsset("myBinaryAsText")asTextAsset;//加載對象11 byte[]bytes=txt.bytes; //檢索二進制數(shù)據(jù)的字節(jié)數(shù)組12 }}

第19頁10.3 AssetBundle相關(guān)知識10.3.3 在資源中包含腳本如果你想在AssetBundles中包含代碼,就需要將腳本預(yù)編譯并上傳到網(wǎng)站中,摒棄引用Reflection類來實現(xiàn)。

1 usingUnityEngine;2 usingSystem.Collections;3 publicclassIncludescripts

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論