<kbd id="9plqc"><label id="9plqc"></label></kbd>

        <th id="9plqc"></th>
        1. <center id="9plqc"><video id="9plqc"></video></center>
          <sub id="9plqc"><form id="9plqc"><pre id="9plqc"></pre></form></sub>
          <nav id="9plqc"><form id="9plqc"><legend id="9plqc"></legend></form></nav>
          Assetbundle的雜七雜八 AssetBundles (Pro only) Building AssetBundles Streaming Assets 您所在的位置:網(wǎng)站首頁(yè) mac如何輸出無(wú)損音樂(lè) Assetbundle的雜七雜八 AssetBundles (Pro only) Building AssetBundles Streaming Assets

          Assetbundle的雜七雜八 AssetBundles (Pro only) Building AssetBundles Streaming Assets

          2025-07-14 02:05| 來(lái)源: 網(wǎng)絡(luò)整理| 查看: 265

          通常我們?cè)谶[戲程式執(zhí)行過(guò)程,並不希望一次將全部的資源都載入,而比較希望實(shí)際上有使用到的才載入,以免佔(zhàn)用多餘的記憶體,所以我們可能會(huì)儘量規(guī)劃好不同功能的場(chǎng)景,在需要時(shí)才載入場(chǎng)景並釋放掉前個(gè)場(chǎng)景中不需要的資源,或是將資源放在 Resource 資料夾中,在真正需要時(shí)才利用 Resources.Load() 把資源載入;這些都是不錯(cuò)的管理方法,但是當(dāng)我們遊戲中的資源相當(dāng)多時(shí),輸出的程式還是會(huì)相當(dāng)龐大,而且如果是時(shí)常會(huì)更新內(nèi)容資源的遊戲,也會(huì)因?yàn)辇嫶蟮馁Y源而造成編譯輸出時(shí)要花相當(dāng)多的時(shí)間;特別是手機(jī)或網(wǎng)頁(yè)遊戲,幾乎輸出最後的結(jié)果只是一個(gè)檔案而已,這個(gè)檔案如果很龐大,將可能造成下載或啟動(dòng)遊戲的不方便;這時(shí)候我們可能就要考慮製作 AssetBundle。

          製作與遊戲主程式分離的資源包可以得到某程度上的好處,我們可以讓遊戲主程式只管理遊戲邏輯的部份,當(dāng)有需要某些資源則從外部的 AssetBundle 載入資源,這樣一來(lái),如果有任何遊戲更新只是添加或更換資源,並沒(méi)有變更到遊戲程式邏輯或內(nèi)容部署,我們只需要重新打包資源的部份就能完成更新,而不再需要整個(gè)遊戲重新編譯輸出。

          例如我們有已上架的 iPhone 遊戲,因?yàn)樘囟ü?jié)日想把遊戲內(nèi)的圖片換成另一種氣氛,通常就必須要重新輸出,然後送審,等節(jié)日過(guò)後又想把圖片換回原本的,要再次輸出遊戲,再送審,一方面送審費(fèi)時(shí)費(fèi)工,另一方面是從送審到架上遊戲更新完成的時(shí)間,我們並不能準(zhǔn)確掌控;如果事先將資源分離打包成 AssetBundle 儲(chǔ)存在我們自己管理的伺服器中,在這種需要換圖的時(shí)刻,只需要打包自行在伺服器中將 AssetBundle 更新即可,可以省掉不斷送審的麻煩,時(shí)間上也更能掌控,另外就是遊戲主程式中沒(méi)有龐大的資源資料,主程式也就會(huì)小一點(diǎn),那麼玩家要下載我們的遊戲也會(huì)更快速些。

          還有就是,我們輸出為網(wǎng)頁(yè)遊戲時(shí)一定會(huì)發(fā)現(xiàn)到,輸出結(jié)果只是一個(gè) html 檔及一個(gè) unity3d 檔,應(yīng)該有寫(xiě)過(guò)網(wǎng)頁(yè)的人都知道,網(wǎng)頁(yè)的運(yùn)作是瀏覽器將網(wǎng)頁(yè)中的文件、圖片、音樂(lè)、影像... 等等的資料下載到客戶端暫存之後再執(zhí)行呈現(xiàn)出結(jié)果,那麼如果我們遊戲內(nèi)容的龐大資源都與主程式編在一起的話,那麼輸出後的 unity3d 檔應(yīng)該也會(huì)不小,此時(shí)我們可能要思考一下,我們希望玩家花多久時(shí)間完成啟動(dòng)頁(yè)面再進(jìn)行遊戲呢?也許 Unity 的 Web Player 有辦法解決這個(gè)問(wèn)題使玩家不會(huì)花太多時(shí)間啟動(dòng)頁(yè)面(這部份我就比較不確定了^_^),但是正因?yàn)榫W(wǎng)頁(yè)的運(yùn)作方式是如此,所以當(dāng)我們?cè)谒欧鞫烁聲r(shí),玩家只要沒(méi)有重新載入頁(yè)面,玩到的遊戲內(nèi)容始終是舊版的,此時(shí)又要考慮到,如果沒(méi)有更新遊戲邏輯或內(nèi)容規(guī)則的情況下,是否有必要強(qiáng)制玩家中斷遊戲重新載入頁(yè)面;如果將資源都打包成 AssetBundle 分離出來(lái),那麼 unity3d 檔這個(gè)主程式的部份將會(huì)變得更小,而當(dāng)有任何資源更新時(shí)只需要在伺服器端將 AssetBundle 的檔案換掉,玩家不需要重新載入頁(yè)面一樣能體驗(yàn)到更新後的內(nèi)容。

          以上寫(xiě)了一大堆,主要就是要說(shuō)明 AssetBundle 是個(gè)很重要又好用的東西,畢竟在沒(méi)變更程式或遊戲部署的情況下,沒(méi)必要去重新 Build 遊戲主程式,以下就來(lái)說(shuō)明如何製作 AssetBundle ...

          首先要使用【自訂 Unity 工具列選單處理專(zhuān)案內(nèi)容】的方法自定義選單命令,使我們能夠作何時(shí)開(kāi)始製作 AssetBundle 及如何做,接下來(lái)我們需要能夠指定哪些資源將打包成 AssetBundle,所以需要使用到 Editor class 的 Selection.GetFiltered(),還有就是要過(guò)濾哪些型別的資源才是我們要的,選擇錯(cuò)誤則略過(guò),不要處理,最後再使用 BuildPipeline.BuildAssetBundle() 建立 AssetBundle 即可,以下範(fàn)例會(huì)在 Unity 專(zhuān)案資料夾(不是 Asset 資料夾)中建立 _AssetBunldes 資料夾用來(lái)存放打包好的 AssetBundle,打包的目標(biāo)為 GameObject、Texture2D、Material 三種型別的資源,如果儲(chǔ)存檔案路徑檔名相同則會(huì)先刪除舊檔:

          [MenuItem("Custom Editor/Create AssetBunldes")]static void ExecCreateAssetBunldes(){

          // AssetBundle 的資料夾名稱及副檔名string targetDir = "_AssetBunldes";string extensionName = ".assetBunldes";

          //取得在 Project 視窗中選擇的資源(包含資料夾的子目錄中的資源)Object[] SelectedAsset = Selection.GetFiltered(typeof (Object), SelectionMode.DeepAssets);

          //建立存放 AssetBundle 的資料夾if(!Directory.Exists(targetDir)) Directory.CreateDirectory(targetDir);

          foreach(Object obj in SelectedAsset){

          //資源檔案路徑string sourcePath = AssetDatabase.GetAssetPath(obj);

          // AssetBundle 儲(chǔ)存檔案路徑string targetPath = targetDir + Path.DirectorySeparatorChar + obj.name + extensionName;

          if(File.Exists(targetPath)) File.Delete(targetPath);

          if(!(obj is GameObject) && !(obj is Texture2D) && !(obj is Material)) continue;

          //建立 AssetBundleif(BuildPipeline.BuildAssetBundle(obj, null, targetPath, BuildAssetBundleOptions.CollectDependencies)){

          Debug.Log(obj.name + " 建立完成");

          }else{

          Debug.Log(obj.name + " 建立失敗");}}}

          以上是直接將選擇的資源打包成 AssetBundle,另外,你也可以在打包前依需求將型別為 GameObject 的資源 Instantiate 到場(chǎng)景中添加需要的 Component 並回到 Project 中建立 Prefab,最後再以這個(gè) Prefab 打包成 AssetBundle,一切就看個(gè)人如何運(yùn)用了。

          製作好的 AssetBundle 最終目的還是要在遊戲中載入,以下用簡(jiǎn)短的範(fàn)例在遊戲畫(huà)面上顯示一個(gè)按鈕,當(dāng)按下按鈕之後載入型別為 GameObject 的 AssetBundle 並利用 Instantiate() 使其實(shí)例化而在場(chǎng)景中產(chǎn)生 GameObject:

          void OnGUI(){

          if(GUI.Button(new Rect(5,35,100,25) , "Load GameObject")){

          StartCoroutine(LoadGameObject());}}

          private IEnumerator LoadGameObject(){

          // AssetBundle 檔案路徑string path = string.Format("file://{0}/../_AssetBunldes/{1}.assetBunldes" , Application.dataPath , "TestGameObject");

          // ?載入 AssetBundleWWW bundle = new WWW(path);

          //等待載入完成yield return bundle;

          //實(shí)例化 GameObject 並等待實(shí)作完成yield return Instantiate(bundle.assetBundle.mainAsset);

          //卸載 AssetBundlebundle.assetBundle.Unload(false);}

          範(fàn)例中的檔案路徑(path)字串是以此程式碼在 Unity 編輯器中執(zhí)行為例,實(shí)作時(shí)應(yīng)該以實(shí)際執(zhí)行平臺(tái)及個(gè)人喜好指定 AssetBundle 存放路徑,詳情可參考官方文件Application.dataPath?說(shuō)明;因?yàn)檩d入的資源必須要等待載入完成以確保遊戲運(yùn)作正常,在 C# 使用 yield 除了回傳型別為 IEnumerator 之外,調(diào)用時(shí)也必須使用 StartCoroutine() 調(diào)用,如果使用 Javascript 則可直接呼叫該 function;如果 AssetBundle 已載入過(guò),下次再請(qǐng)求載入將會(huì)出現(xiàn) 【The asset bundle '檔名' can't be loaded because another asset bundle with the same files are already loaded】的錯(cuò)誤訊息,即使使用區(qū)域變數(shù)(範(fàn)例中的 bundle)仍然會(huì)得到這個(gè)錯(cuò)誤訊息,所以必須在每次載入使用完後將 AssetBundle 卸載;另外,要特別注意的是載入 AssetBundle 到卸載期間可能消耗些微時(shí)間,如果連續(xù)調(diào)用載入同一個(gè) AssetBundle,造成在卸載前重複載入也可能出現(xiàn)前面的錯(cuò)誤訊息,所以,最好是能定義個(gè)陣列或其它變數(shù)來(lái)記錄載入中的 AssetBundle 有哪些,以此變數(shù)內(nèi)容在載入 AssetBundle 前檢查。



          【本文地址】

          公司簡(jiǎn)介

          聯(lián)系我們

          今日新聞

          推薦新聞

          專(zhuān)題文章
            CopyRight 2018-2019 實(shí)驗(yàn)室設(shè)備網(wǎng) 版權(quán)所有
            黄色免费网站在线看,韩国精品在线观看,韩国美女一区二区,99国产热 泌阳县| 襄樊市| 错那县| 巫山县| 马山县| 双鸭山市| 永川市| 昭平县| 沙湾县| 仙桃市| 裕民县| 周口市| 应城市| 晋州市| 深州市| 来宾市| 衢州市| 金溪县| 台南市| 济宁市| 和田市| 伊春市| 北流市| 景泰县| 武义县| 襄樊市| 江安县| 苏尼特右旗| 湘潭市| 玉溪市| 韩城市| 根河市| 永新县| 乐陵市| 翁牛特旗| 龙门县| 辉县市| 大渡口区| 宝丰县| 五华县| 榆社县| http://444 http://444 http://444 http://444 http://444 http://444