91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Unity AssetBundle入門知識點有哪些

發布時間:2022-01-11 15:50:39 來源:億速云 閱讀:189 作者:iii 欄目:大數據

今天小編給大家分享一下Unity AssetBundle入門知識點有哪些的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

1. AssetBundle的定義和作用

AssetBundle(簡稱AB包)是一個資源壓縮包,包含模型、貼圖、預制體、聲音、甚至整個場景,可以在游戲運行的時候被加載;

AssetBundle自身保存著互相的依賴關系;

壓縮包可以使用LZMA和LZ4壓縮算法,減少包大小,更快的進行網絡傳輸;

把一些可以下載內容放在AssetBundle里面,可以減少安裝包的大小;

2. 什么是AssetBundle?

它是一個存在于硬盤上的文件。可以稱之為壓縮包。這個壓縮包可以認為是一個文件夾,里面包含了多個文件。這些文件可以分為兩類:serialized file 和 resource files。(序列化文件和源文件)

serialized file:資源被打碎放在一個對象中,最后統一被寫進一個單獨的文件(只有一個)

resource files:某些二進制資源(圖片、聲音)被單獨保存,方便快速加載,可以Editor上讀取,方便查看

它是一個AssetBundle對象,我們可以通過代碼從一個特定的壓縮包加載出來的對象。這個對象包含了所有我們當初添加到這個壓縮包里面的內容,我們可以通過這個對象加載出來使用。

3. AssetBundle使用步驟

指定資源的AssetBundle屬性

(xxxa/xxx)這里xxxa會生成目錄,名字為xxx。’/'可以用于目錄劃分,Remove UnUsed name 可以移除沒有使用的屬性名

構建AssetBundle包

上傳AB包

加載AB包和包里面的資源

4. 代碼打包AssetBundle

使用編輯器擴展方法,將打包按鈕Build AssetBundles放于Asset菜單下

using UnityEditor;

using System.IO;

public class CreateAssetBundles{    [MenuItem("Assets/Build AssetBundles")]    static void BuildAllAssetBundles()    {        string dir = "AssetBundles";        if (Directory.Exists(dir) == false)        {            Directory.CreateDirectory(dir);        }        //BuildTarget 選擇build出來的AB包要使用的平臺        BuildPipeline.BuildAssetBundles(dir, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);    }}

壓縮方式

Build的路徑(隨意只要是在硬盤上都可以的)

BuildAssetBundleOptions

BuildAssetBundleOptions.None:使用LZMA算法壓縮,壓縮的包更小,但是加載時間更長。使用之前需要整體解壓。一旦被解壓,這個包會使用LZ4重新壓縮。使用資源的時候不需要整體解壓。在下載的時候可以使用LZMA算法,一旦它被下載了之后,它會使用LZ4算法保存到本地上。

BuildAssetBundleOptions.UncompressedAssetBundle:不壓縮,包大,加載快

BuildAssetBundleOptions.ChunkBasedCompression:使用LZ4壓縮,壓縮率沒有LZMA高,但是我們可以加載指定資源而不用解壓全部。

注意:使用LZ4壓縮,可以獲得可以跟不壓縮想媲美的加載速度,而且比不壓縮文件要小。

依賴打包

將需要同時加載的資源放在同一個包里,各個包之間會保存相互依賴的信息

5. AssetBundle的加載和卸載

AB的加載

在開發階段將AB包放在本地,開發結束后再上傳到服務器

public class LoadFromLocal : MonoBehaviour{    private void Start()    {        AssetBundle ab = AssetBundle.LoadFromFile("AssetBundles/scene/wall.jy");        GameObject obj = ab.LoadAsset<GameObject>("wall");        Instantiate(obj);    }}
private void Start(){    AssetBundle ab = AssetBundle.LoadFromMemory(File.ReadAllBytes("AssetBundles/scene/cube.jy"));    GameObject obj = ab.LoadAsset<GameObject>("Cube(Clone)");    Instantiate(obj);}
IEnumerator Start(){    AssetBundleCreateRequest request = AssetBundle.LoadFromMemoryAsync(File.ReadAllBytes("AssetBundles/scene/cube.jy"));    yield return request;    AssetBundle ab = request.assetBundle;    GameObject obj = ab.LoadAsset<GameObject>("Cube(Clone)");    Instantiate(obj);}
 IEnumerator Start(){    while (Caching.ready == false)    {        yield return null;    }

   WWW www = WWW.LoadFromCacheOrDownload(@"file://E:\U3D-Projects\Test2017.2.0\AssetBundles\scene\cube.jy", 1);    yield return www;    if (!string.IsNullOrEmpty(www.error))    {        Debug.Log(www.error);        yield break;    }    AssetBundle ab = www.assetBundle;    GameObject obj = ab.LoadAsset<GameObject>("Cube(Clone)");    Instantiate(obj);}
 IEnumerator Start(){    string url = @"file:///E:\U3D-Projects\Test2017.2.0\AssetBundles\scene\cube.jy";    UnityWebRequest request = UnityWebRequest.GetAssetBundle(url);    yield return request.SendWebRequest();    //方式一    //AssetBundle ab = DownloadHandlerAssetBundle.GetContent(request);    //方式二    AssetBundle ab = (request.downloadHandler as DownloadHandlerAssetBundle).assetBundle;    GameObject obj = ab.LoadAsset<GameObject>("Cube(Clone)");    Instantiate(obj);}

AB加載方式:

AssetBundle.LoadFromFile 從本地加載

AssetBundle.LoadFromMemory 從內存加載

WWW.LoadFromCacheOrDownload 下載后放在緩存中備用(該方法逐漸被棄用)

UnityWebRequest 從服務器下載

從AB中加載資源:

AssetBundle.LoadAsset(assetName)

AssetBundle.LoadAllAssets() 加載AB包中所有的對象,不包含依賴的包

AssetBundle.LoadAssetAsync() 異步加載,加載較大資源的時候

AssetBundle.LoadAllAssetsAsync() 異步加載全部資源

AssetBundle.LoadAssetWithSubAssets 加載資源及其子資源

AB的卸載

減少內存的使用

有可能導致丟失

在切換場景,或者確定不使用的時候卸載

AssetBundle.Unload(true) 卸載所有資源,包含其中正被使用的資源

AssetBundle.Unload(false) 卸載所有沒被使用的資源

Resources.UnloadUnusedAssets 卸載個別未使用的資源

6. AssetBundle分組策略總結

邏輯實體分組

一個UI界面或者所有UI界面一個包(這個界面里面的貼圖和布局信息一個包)

一個角色或者所有角色一個包(這個角色里面的模型和動畫一個包)

所有的場景所共享的部分一個包(包括貼圖和模型)

按照類型分組

所有聲音資源打成一個包,所有shader打成一個包,所有模型打成一個包,所有材質打成一個包

按照使用分組

把在某一時間內使用的所有資源打成一個包。可以按照關卡分,一個關卡所需要的所有資源包括角色、貼圖、聲音等打成一個包。也可以按照場景分,一個場景所需要的資源一個包

注意

經常更新的資源放在一個單獨的包里面,跟不經常更新的包分離

把需要同時加載的資源放在一個包里面

可以把其他包共享的資源放在一個單獨的包里面

把一些需要同時加載的小資源打包成一個包

如果對于一個同一個資源有兩個版本,可以考慮通過后綴來區分,例如v1、v2、v3

7. Manifest文件

什么是Manifest文件

crc為校驗碼,通過其檢查是否完整

Assets 表示包里包含多少資源

Dependencies 表示包有哪些依賴

注意:在加載這些包之前,也需要加載依賴的包,不然會丟失這部分內容,顯示效果不正確

通過Manifest文件得到某個包的依賴

可以注意到scene/cube.jy依賴于material.jy,而material.jy依賴于texture.jy

AssetBundle manifestAB = AssetBundle.LoadFromFile("AssetBundles/AssetBundles");AssetBundleManifest manifest = manifestAB.LoadAsset<AssetBundleManifest>("AssetBundleManifest");//GetAllDependencies獲取到所有的依賴對象string[] strs = manifest.GetAllDependencies("scene/cube.jy");//將所有依賴對象依次加載出來foreach (var item in strs){    Debug.Log(item);      AssetBundle.LoadFromFile("AssetBundles/" + item);}

如此,對象的材質也加載顯示出來:

8. 文件校驗

CRC、MD5、SHA1都是通過對數據進行計算,來生成一個校驗值,該校驗值用來校驗數據的完整性。

CRC一般用于通信數據的校驗,MD5和SHA1用于安全領域,例如文件校驗,密碼加密等

9. AssetBundles瀏覽工具

GitHub下載地址

工具面板如下:

Build Target 用于設置AB包的目標平臺

OutPut Path 設置AB的輸出路徑

Build 一鍵打包

以上就是“Unity AssetBundle入門知識點有哪些”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

静乐县| 临猗县| 浦北县| 建平县| 潜江市| 静安区| 景宁| 四会市| 绥芬河市| 改则县| 北海市| 新巴尔虎右旗| 卢湾区| 金川县| 图们市| 盱眙县| 阆中市| 乌拉特前旗| 桐柏县| 开远市| 嫩江县| 贡觉县| 沙雅县| 乌苏市| 万全县| 房产| 元氏县| 辽阳县| 塘沽区| 宕昌县| 扶绥县| 灌云县| 尚义县| 清涧县| 余庆县| 英山县| 曲阳县| 洪江市| 乌恰县| 巩义市| 施秉县|