zoukankan      html  css  js  c++  java
  • 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文件。

  • 相关阅读:
    数学+高精度 ZOJ 2313 Chinese Girls' Amusement
    最短路(Bellman_Ford) POJ 1860 Currency Exchange
    贪心 Gym 100502E Opening Ceremony
    概率 Gym 100502D Dice Game
    判断 Gym 100502K Train Passengers
    BFS POJ 3278 Catch That Cow
    DFS POJ 2362 Square
    DFS ZOJ 1002/HDOJ 1045 Fire Net
    组合数学(全排列)+DFS CSU 1563 Lexicography
    stack UVA 442 Matrix Chain Multiplication
  • 原文地址:https://www.cnblogs.com/cyct/p/10664059.html
Copyright © 2011-2022 走看看