unity當前項目里面AssetBundle和加載的方法總結


 

 版權聲明:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/lmyfx/article/details/78236225
一、設置assetBundleName
二、構建AssetBundle包
三、上傳AssetBundle到服務器
四、把AssetBundle放到本地
五、操作AssetBundle
六、完整例子
七、AssetBundle Manager管理工具
八、備注知識

 

一、設置assetBundleName

如果沒有設置AssetBundleName,會打包所有的Assets下的資源,如果設置,就只打包設置了名字的資源

 

1、在unity編輯器界面手動設置

輸入所需的AssetBundle名稱。請注意,AssetBundle名稱確實支持一種類型的文件夾結構,這取決於您鍵入的內容。要添加子文件夾,將文件夾名稱以“/”分隔。例如:AssetBundle名稱“environment/ forest”將在environment子文件夾下創建一個名為forest的包

2、遍歷所有要打包的資源,通過代碼修改assetBundleName       

第一步:先獲取你要打包的資源的完整目錄

       方法1:

先用Selection.objects返回場景中所有的對象,

然后用AssetDatabase.GetAssetPath(selected)獲取對象完整目錄

方法2:

用AssetPostprocessor的OnPostprocessAllAssets方法

方法3:

用IO流的DirectoryInfo.GetFileSystemInfos()

和FileInfonfo獲取完整目錄(這種方法要注意:獲取到的目錄如果是”\”或者”//”要替換為“/”)

第二步:用AssetImporter asset= AssetImporter.GetAtPath(path);方法獲取AssetImporter

第三步:用asset.assetBundleName=“text”設置AssetBundleName

 

有以下三種獲取目錄然后設置assetBundleName的方法

 

  1.  
    //Selection.objects返回場景中所有的對象
  2.  
    Object[] selects = Selection.objects;
  3.  
    foreach (Object selected in selects)
  4.  
    {
  5.  
    //返回所有對象相對於工程目錄的存儲路徑如Assets/_Scenes/Main.unity
  6.  
    string path = AssetDatabase.GetAssetPath(selected);
  7.  
    //把一個目錄的對象檢索為AssetImporter
  8.  
    AssetImporter asset = AssetImporter.GetAtPath(path);
  9.  
    asset.assetBundleName = selected.name; //設置Bundle文件的名稱
  10.  
    asset.assetBundleVariant = "unity3d";//設置Bundle文件的擴展名
  11.  
    asset.SaveAndReimport();
  12.  
    }
  13.  
    AssetDatabase.Refresh();

  1.  
    using UnityEngine;
  2.  
    using System.Collections;
  3.  
    using UnityEditor;
  4.  
    //文件描述:自動設置Assetbundle名字為文件夾名_文件名.unity3d;
  5.  
    public class AutoSetTextureUISprite : AssetPostprocessor
  6.  
    {
  7.  
    static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths)
  8.  
    {
  9.  
    foreach (var str in importedAssets)
  10.  
    {
  11.  
    if (!str.EndsWith(".cs"))
  12.  
    {
  13.  
    AssetImporter importer = AssetImporter.GetAtPath(str);
  14.  
    importer.assetBundleName = str;
  15.  
     
  16.  
    }
  17.  
    }
  18.  
    foreach (var str in deletedAssets)
  19.  
    {
  20.  
    if (!str.EndsWith(".cs"))
  21.  
    {
  22.  
    AssetImporter importer = AssetImporter.GetAtPath(str);
  23.  
    importer.assetBundleName = str;
  24.  
    }
  25.  
    }
  26.  
    for (var i = 0; i < movedAssets.Length; i++)
  27.  
    {
  28.  
    //Debug.Log("Moved Asset: " + movedAssets[i] + " from: " + movedFromAssetPaths[i]);
  29.  
    }
  30.  
    }
  31.  
    }
  1.  
    using UnityEngine;
  2.  
    using System.Collections;
  3.  
    using UnityEditor;
  4.  
    using System.IO;
  5.  
     
  6.  
    /// <summary>
  7.  
    /// 把Resource下的資源打包成.unity3d 到StreamingAssets目錄下
  8.  
    /// </summary>
  9.  
    public class Builder : Editor
  10.  
    {
  11.  
    public static string sourcePath = Application.dataPath + "/Resources";
  12.  
    const string AssetBundlesOutputPath = "Assets/StreamingAssets";
  13.  
     
  14.  
    //[MenuItem("Tools/AssetBundle/Build")]
  15.  
    public static void BuildAssetBundle()
  16.  
    {
  17.  
    ClearAssetBundlesName();
  18.  
     
  19.  
    Pack(sourcePath);
  20.  
     
  21.  
    string outputPath = Path.Combine(AssetBundlesOutputPath, Platform.GetPlatformFolder(EditorUserBuildSettings.activeBuildTarget));
  22.  
    if (!Directory.Exists(outputPath))
  23.  
    {
  24.  
    Directory.CreateDirectory(outputPath);
  25.  
    }
  26.  
     
  27.  
    //根據BuildSetting里面所激活的平台進行打包
  28.  
    BuildPipeline.BuildAssetBundles(outputPath, 0, EditorUserBuildSettings.activeBuildTarget);
  29.  
     
  30.  
    AssetDatabase.Refresh();
  31.  
     
  32.  
    Debug.Log( "打包完成");
  33.  
     
  34.  
    }
  35.  
     
  36.  
    /// <summary>
  37.  
    /// 清除之前設置過的AssetBundleName,避免產生不必要的資源也打包
  38.  
    /// 之前說過,只要設置了AssetBundleName的,都會進行打包,不論在什么目錄下
  39.  
    /// </summary>
  40.  
    static void ClearAssetBundlesName()
  41.  
    {
  42.  
    int length = AssetDatabase.GetAllAssetBundleNames().Length;
  43.  
    Debug.Log(length);
  44.  
    string[] oldAssetBundleNames = new string[length];
  45.  
    for (int i = 0; i < length; i++)
  46.  
    {
  47.  
    oldAssetBundleNames[i] = AssetDatabase.GetAllAssetBundleNames()[i];
  48.  
    }
  49.  
     
  50.  
    for (int j = 0; j < oldAssetBundleNames.Length; j++)
  51.  
    {
  52.  
    AssetDatabase.RemoveAssetBundleName(oldAssetBundleNames[j], true);
  53.  
    }
  54.  
    length = AssetDatabase.GetAllAssetBundleNames().Length;
  55.  
    Debug.Log(length);
  56.  
    }
  57.  
     
  58.  
    static void Pack(string source)
  59.  
    {
  60.  
    DirectoryInfo folder = new DirectoryInfo(source);
  61.  
    FileSystemInfo[] files = folder.GetFileSystemInfos();
  62.  
    int length = files.Length;
  63.  
    for (int i = 0; i < length; i++)
  64.  
    {
  65.  
    if (files[i] is DirectoryInfo)
  66.  
    {
  67.  
    Pack(files[i].FullName);
  68.  
    }
  69.  
    else
  70.  
    {
  71.  
    if (!files[i].Name.EndsWith(".meta"))
  72.  
    {
  73.  
    file(files[i].FullName);
  74.  
    }
  75.  
    }
  76.  
    }
  77.  
    }
  78.  
     
  79.  
    static void file(string source)
  80.  
    {
  81.  
    string _source = Replace(source);
  82.  
    string _assetPath = "Assets" + _source.Substring(Application.dataPath.Length);
  83.  
    string _assetPath2 = _source.Substring(Application.dataPath.Length + 1);
  84.  
    //Debug.Log (_assetPath);
  85.  
     
  86.  
    //在代碼中給資源設置AssetBundleName
  87.  
    AssetImporter assetImporter = AssetImporter.GetAtPath(_assetPath);
  88.  
    string assetName = _assetPath2.Substring(_assetPath2.IndexOf("/") + 1);
  89.  
    assetName = assetName.Replace(Path.GetExtension(assetName), ".unity3d");
  90.  
    //Debug.Log (assetName);
  91.  
    assetImporter.assetBundleName = assetName;
  92.  
    }
  93.  
     
  94.  
    static string Replace(string s)
  95.  
    {
  96.  
    return s.Replace("\\", "/");
  97.  
    }
  98.  
    }
  99.  
     
  100.  
    public class Platform
  101.  
    {
  102.  
    public static string GetPlatformFolder(BuildTarget target)
  103.  
    {
  104.  
    switch (target)
  105.  
    {
  106.  
    case BuildTarget.Android:
  107.  
    return "Android";
  108.  
    case BuildTarget.iOS:
  109.  
    return "IOS";
  110.  
    case BuildTarget.WebPlayer:
  111.  
    return "WebPlayer";
  112.  
    case BuildTarget.StandaloneWindows:
  113.  
    case BuildTarget.StandaloneWindows64:
  114.  
    return "Windows";
  115.  
    case BuildTarget.StandaloneOSXIntel:
  116.  
    case BuildTarget.StandaloneOSXIntel64:
  117.  
    case BuildTarget.StandaloneOSXUniversal:
  118.  
    return "OSX";
  119.  
    default:
  120.  
    return null;
  121.  
    }
  122.  
    }
  123.  
     
  124.  
    }

二、構建AssetBundle

 

1、在Assets中創建一個名為Editor的文件夾,並將一個腳本放在文件夾中

2、類要繼承Editor,引用命名空間using UnityEditor;

3、創建菜單目錄:[MenuItem("Assets/Build AssetBundles")]

4、調用打包方法

①用AssetBundleBuild類的方法
BuildAssetBundles(string outputPath, BuildAssetBundleOptionsassetBundleOptions, BuildTargettargetPlatform);
或者

 

BuildAssetBundles(string outputPath,AssetBundleBuild[] builds,BuildAssetBundleOptions assetBundleOptions, BuildTarget targetPlatform);

 

②參數說明:

outputPath:打包Bundle后存儲的目錄,如:Assets/AssetBundles,這個文件夾不會自動創建,如果它不存在的話,函數將會失敗,Directory.Exists(string path)判斷目錄是否存在,Directory.CreateDirectory(stringpath)創建目錄

BuildAssetBundleOptions:Bundle打包方式,none沒有任何特殊選項,UncompressedAssetBundle在構建Bundle時不要壓縮數據等等

BuildTarget:構建平台,如iphone,windows,android等

 

AssetBundleBuild[]:看備注知識5

③返回值:AssetBundleManifest,看備注知識6

5、備注知識:AssetBundleBuild

這個類與BuildAssetBundles一起使用。指定一個Bundle包的名稱assetBundleName和它將包含的資源(如多張圖片、音頻等)的名稱。

被傳遞給函數的AssetBundleBuild[]元素數組被稱為“構建映射”,並作為指定編輯器包內容的替代方法。

變量:

 

addressableNames:返回所有的addressableName數組

    assetBundleName:AssetBundle的名字

    assetBundleVariant:AssetBundle的擴展名如.unity

AssetBundle:指定屬於一個addressableName名字的所有資源名字,是一個數組,也就是一個addressableName名字下包含的所有資源名字

例子:在后面

 

6、備注知識AssetBundleManifest 
包含所有創建Bundle包信息

⑴公開方法

GetAllAssetBundles返回所有的assetbundlenames,是一個string[]數組

GetAllAssetBundlesWithVariant返回所有使用給定擴展名的assetbundlenames,是一個string[]數組

GetAllDependencies(string assetBundleName);:獲取所有與指定AssetBundle包存在依賴關系的AssetBundless。也就是給一個assetBundleName,獲取所有與他有關系的assetBundleName,返回一個string[]數組

GetDirectDependencies(string assetBundleName):獲取所有與指定AssetBundle包存在直接聯系的AssetBundless。也就是給一個assetBundleName,獲取所有與他有直接關系的assetBundleName,返回一個string[]數組

GetAssetBundleHash

⑵當找到這個對象后就可以對它進行操作

7、例子

第一個方法

  1.  
    // 創建一個Windows AssetBundle包
  2.  
    using UnityEngine;
  3.  
    using UnityEditor;
  4.  
    using System.IO;
  5.  
    public class BuildAssetBundlesExample : MonoBehaviour
  6.  
    {
  7.  
    //創建編輯器菜單目錄
  8.  
    [ MenuItem("Example/Build Asset Bundles")]
  9.  
    static void BuildABs()
  10.  
    {
  11.  
    //將這些資源包放在一個名為ABs的目錄下
  12.  
    string assetBundleDirectory = "Assets/ABs";
  13.  
    //如果目錄不存在,就創建一個目錄
  14.  
    if (!Directory.Exists(assetBundleDirectory))
  15.  
    {
  16.  
    Directory.CreateDirectory(assetBundleDirectory);
  17.  
    }
  18.  
    BuildPipeline.BuildAssetBundles(assetBundleDirectory, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows);
  19.  
    }
  20.  
    }
第二個方法

 

  1.  
    using UnityEngine;
  2.  
    using UnityEditor;
  3.  
    using System.IO;
  4.  
    public class BuildAssetBundlesBuildMapExample : MonoBehaviour
  5.  
    {
  6.  
    [ MenuItem("Example/Build Asset Bundles Using BuildMap")]
  7.  
    static void BuildMapABs()
  8.  
    {
  9.  
    // 創建映射數組
  10.  
    AssetBundleBuild[] buildMap = new AssetBundleBuild[2];
  11.  
     
  12.  
    //修改assetBundleName第一個
  13.  
    buildMap[ 0].assetBundleName = "enemybundle";
  14.  
    //assetBundleName = "enemybundle"下的所有資源名稱數組
  15.  
    string[] enemyAssets = new string[2];
  16.  
    enemyAssets[ 0] = "Assets/Textures/char_enemy_alienShip.jpg";
  17.  
    enemyAssets[ 1] = "Assets/Textures/char_enemy_alienShip-damaged.jpg";
  18.  
    buildMap[ 0].assetNames = enemyAssets;
  19.  
     
  20.  
    //修改assetBundleName第二個
  21.  
    buildMap[ 1].assetBundleName = "herobundle";
  22.  
    //assetBundleName = "herobundle"下的所有資源名稱數組
  23.  
    string[] heroAssets = new string[1];
  24.  
    heroAssets[ 0] = "char_hero_beanMan";
  25.  
    buildMap[ 1].assetNames = heroAssets;
  26.  
     
  27.  
    //創建Bundle包
  28.  
     
  29.  
    //將這些資源包放在一個名為ABs的目錄下
  30.  
    string assetBundleDirectory = "Assets/ABs";
  31.  
    //如果目錄不存在,就創建一個目錄
  32.  
    if (!Directory.Exists(assetBundleDirectory))
  33.  
    {
  34.  
    Directory.CreateDirectory(assetBundleDirectory);
  35.  
    }
  36.  
    BuildPipeline.BuildAssetBundles(assetBundleDirectory, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows);
  37.  
    }
  38.  
    }

三、上傳AssetBundle到服務器

四、把AssetBundle放到本地

五、操作AssetBundle

 

1、從磁盤目錄加載AssetBundle包

⑴AssetBundle放在本地

public static AssetBundle LoadFromFile(string  path uint crc = 0, ulong offset= 0);

 

說明:從path目錄同步加載AssetBundle,返回類型

AssetBundle(LoadFromFileAsync是異步加載)

 

參數:path讀取AssetBundle的目錄

      crc 校驗用參數

      offset這個值指定從哪里開始讀取AssetBundle,

通常為0

⑵ AssetBundle放在網絡

引用using UnityEngine.Networking;命名空間

UnityWebRequest.GetAssetBundle()方法看后面的詳細介紹

2、加載AssetBundle包之后,加載包內資源

注意:加載要用協程,否則你不知道是否加載完畢

⑴加載一個資源

AssetBundle類

public Object LoadAsset(string name);

從AssetBundle包中加載名字為name的資源,返回object

   public Object LoadAsset(string name, Type type);

加載一個包內名字為name,類型為type的資源

public T LoadAsset(string name);

搞不懂,也是加載名字為name類型為T的資源

⑵加載包內的多個資源

AssetBundle類

public Object[] LoadAllAssets(Type type);

加載包內所有類型為type的資源

public Object[] LoadAllAssets();

加載包內的所有資源

public T[] LoadAllAssets();

搞不懂,也是加載類型為T的資源

⑶備注,上面的方法是同步加載,還有異步加載方法

LoadAllAssetsAsyncLoadAssetAsync

3、從包內加載資源以后,可以對這個對象進行各種操作了

4、備注知識點

   ⑴Path.Combine(string, string) 連接兩個字符串

⑵ Application 訪問應用程序運行時數據

Application.streamingAssetsPath輸出

E:/UnityProject/ARVR/Workspace/MyCharacter/Assets/StreamingAssets

Application.dataPath輸出

E:/UnityProject/ARVR/Workspace/MyCharacter/Assets

值得注意的是如果在PC上使用時需要在每個文件夾前加入斜杠,如:

string uri = "file:///" + Application.dataPath + "/AssetBundles/" + assetBundleName;

例子:注意:加載要用協程,否則你不知道是否加載完畢

  1.  
    using UnityEngine;
  2.  
    using System.Collections;
  3.  
    using System.IO;
  4.  
    public class LoadFromFileExample : MonoBehaviour
  5.  
    {
  6.  
    void Start()
  7.  
    {
  8.  
    //從文件夾里加載包
  9.  
    var myLoadedAssetBundle = AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, "myassetBundle"));
  10.  
    if (myLoadedAssetBundle == null)
  11.  
    {
  12.  
    Debug.Log( "Failed to load AssetBundle!");
  13.  
    return;
  14.  
    }
  15.  
    //從Bundle包中加載名字為:MyObject的資源,加載為GameObject
  16.  
    var prefab = myLoadedAssetBundle.LoadAsset<GameObject>("MyObject");
  17.  
    //實例化
  18.  
    Instantiate(prefab);
  19.  
    //卸載包中資源的內存
  20.  
    myLoadedAssetBundle.Unload( false);
  21.  
    }
  22.  
    }

5、AssetBundle放在網絡

⑴創建一個UnityWebRequest,通過HTTP GET下載一個Unity資產包

引用using UnityEngine.Networking;命名空間

UnityWebRequest.GetAssetBundle()方法
  1.  
    public static UnityWebRequest GetAssetBundle(string uri, uint crc);
  2.  
     
  3.  
    public static UnityWebRequest GetAssetBundle(string uri, uint version, uint crc);
  4.  
     
  5.  
    public static UnityWebRequest GetAssetBundle(string uri, Hash128 hash, uint crc);
  6.  
     
  7.  
    public static UnityWebRequest GetAssetBundle(string uri, CachedAssetBundle cachedAssetBundle, uint crc);

返回值:UnityWebRequest

參數:

uri:AssetsBundle包的網絡地址:(可以是本地file:)

crc:0,如果不為0,將會進行校驗

version:一個整數版本號

hash:一個版本散列

cachedAssetBundle:用於將給定版本的AssetBundle下載到自定義緩存路徑的結構

⑵處理上一步的UnityWebRequest

用DownloadHandlerAssetBundle.GetContent()方法

public static AssetBundle GetContent(Networking.UnityWebRequest www);

www:就是上一步處理的UnityWebRequest

AssetBundle:返回值類型

例子

 

  1.  
    IEnumerator InstantiateObject()
  2.  
     
  3.  
    {
  4.  
    string uri = "file:///" + Application.dataPath + "/AssetBundles/" + assetBundleName;
  5.  
    UnityEngine.Networking.UnityWebRequest request = UnityEngine.Networking.UnityWebRequest.GetAssetBundle(uri, 0);
  6.  
    yield return request.Send();
  7.  
    AssetBundle bundle = DownloadHandlerAssetBundle.GetContent(request);
  8.  
    GameObject cube = bundle.LoadAsset<GameObject>( "Cube");
  9.  
    GameObject sprite = bundle.LoadAsset<GameObject>( "Sprite");
  10.  
    Instantiate(cube);
  11.  
    Instantiate(sprite);
  12.  
    }

六、完整例子

  1.  
    using System.Collections;
  2.  
    using System.Collections.Generic;
  3.  
    using UnityEngine;
  4.  
    using System.IO;
  5.  
    using UnityEngine.UI;
  6.  
    using UnityEngine.Networking;
  7.  
    public class NewBehaviourScript : MonoBehaviour {
  8.  
     
  9.  
    Image image1;
  10.  
    Image Image2;
  11.  
    void Start () {
  12.  
    image1 = GameObject.Find( "Image (1)").GetComponent<Image>();
  13.  
    Image2 = GameObject.Find( "Image (2)").GetComponent<Image>();
  14.  
    StartCoroutine(InstantiateObject());
  15.  
    StartCoroutine(InstantiateObjects());
  16.  
    }
  17.  
    //一個包有多個資源
  18.  
    IEnumerator InstantiateObjects()
  19.  
    {
  20.  
    //texture是一個文件夾,里面放了多張圖片
  21.  
    string uri = "file:///" + Application.dataPath + "/AssetsBundles/texture";
  22.  
    UnityWebRequest request = UnityWebRequest.GetAssetBundle(uri, 0);
  23.  
    yield return request.Send();
  24.  
    AssetBundle bundle = DownloadHandlerAssetBundle.GetContent(request);
  25.  
    Object[] obj = bundle.LoadAllAssets( typeof(Sprite));
  26.  
    Sprite[] sprite = new Sprite[obj.Length];
  27.  
    for (int i = 0; i < obj.Length; i++)
  28.  
    {
  29.  
    sprite[i] = obj[i] as Sprite;
  30.  
    }
  31.  
    this.gameObject.GetComponent<Image>().sprite = sprite[0];
  32.  
    image1.sprite = sprite[ 1];
  33.  
     
  34.  
    //string path = Application.dataPath + "/AssetsBundles/texture";
  35.  
    //AssetBundle assetbundle = AssetBundle.LoadFromFile(path, 0, 0);
  36.  
    //yield return assetbundle;
  37.  
    //if (assetbundle == null)
  38.  
    //{
  39.  
    // print("加載Bundle為空");
  40.  
    //}
  41.  
    //加載類型為sprite的圖片,否則一張圖片會加載成兩個
  42.  
    //Object[] obj =assetbundle.LoadAllAssets(typeof(Sprite));
  43.  
    //Sprite[] sprite = new Sprite[obj.Length];
  44.  
    //for (int i = 0; i < obj.Length; i++)
  45.  
    //{
  46.  
    // sprite[i] = obj[i] as Sprite;
  47.  
    //}
  48.  
    //this.gameObject.GetComponent<Image>().sprite = sprite[0];
  49.  
    //image1.sprite = sprite[1];
  50.  
    }
  51.  
    //一個包有一個資源
  52.  
    IEnumerator InstantiateObject()
  53.  
    {
  54.  
    //用UnityWebRequest讀取
  55.  
    //string uri = "file:///" + Application.dataPath + "/AssetsBundles/gress";
  56.  
    //UnityWebRequest request = UnityWebRequest.GetAssetBundle(uri, 0);
  57.  
    //yield return request.Send();
  58.  
    //AssetBundle bundle = DownloadHandlerAssetBundle.GetContent(request);
  59.  
    //GameObject cube = bundle.LoadAsset<GameObject>("gress");
  60.  
    //Sprite sprite = bundle.LoadAsset<Sprite>("gress");
  61.  
    //this.gameObject.GetComponent<Image>().sprite = sprite;
  62.  
     
  63.  
    //用AssetBundle讀取
  64.  
    string path = Application.dataPath + "/AssetsBundles/gress";
  65.  
    AssetBundle assetbundle = AssetBundle.LoadFromFile(path, 0, 0);
  66.  
    yield return assetbundle;
  67.  
    if (assetbundle == null)
  68.  
    {
  69.  
    print( "加載Bundle為空");
  70.  
    }
  71.  
    Sprite sprite = assetbundle.LoadAsset<Sprite>( "gress");
  72.  
    Image2.sprite = sprite;
  73.  
    }
  74.  
     
  75.  
    // Update is called once per frame
  76.  
    void Update () {
  77.  
     
  78.  
    }
  79.  
    }

七、AssetBundle Manager管理工具

 

 

AssetBundle Manage是一個管理AssetBundle的工具,在官方資源商店尋找

文檔說明

https://docs.unity3d.com/Manual/AssetBundles-Manager.html

下載地址

https://www.assetstore.unity3d.com/en/#!/content/45836

AssetBundle Manager是一個由Unity制作的工具,它可以使AssetBundle更加高效。

下載並導入AssetBundle Manager包不僅增加了加載和使用AssetBundle的新API,而且還添加了一些編輯器功能來簡化工作流。這個功能可以在Assets菜單選項下找到。

八、備注

1、基於平台的加載AssetBundle方法

   AssetBundle.LoadFromMemoryAsync

    AssetBundle.LoadFromFile

    WWW.LoadfromCacheOrDownload

UnityWebRequest DownloadHandlerAssetBundle(Unity 5.3 or newer)

方法:https://docs.unity3d.com/Manual/AssetBundles-Native.html

2、一些知識點網址

Unity5.X新版AssetBundle使用方案及策略

http://www.cnblogs.com/jiangshuai52511/p/6437239.html

Unity5新的AssetBundle系統使用心得

http://blog.csdn.net/langresser_king/article/details/44208585

[Unity熱更新]unity5中的assetbundle

http://blog.csdn.net/lyh916/article/details/49815871

3、下面的方法未經過測試,先記錄下來,待以后查詢

       (1)、為需要打包到AssetBundle中的資源設置其assetBundleName,有兩種方式可以實現這個功能:一是手動在編輯界面對資源一一進行手動設置;二是遍歷需要設置的資源目錄,通過代碼動態設置。顯然第二個辦法更加方便,具體的步驟如下:

        a.遍歷要打包的資源目錄,找到需要打包的預設或者資源;

        b.設置資源的assetBundleName屬性;

        c.通過AssetDatabase.GetDependencies(stringpath)方法逐個找到資源的依賴資源路徑;

        d.使用AssetDatabase.AssetPathToGUID(stringpath)計算出每個資源的唯一ID,然后將此ID當做assetBundleName賦予每個依賴資源;

        e.調用BuildPipeline.BuildAssetBundles(stringoutputPath)打包到指定位置。

 

      (2).資源加載:

        由於依賴關系存在於manifest中,所以加載資源之前,需要先加載manifest文件。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM