一、设置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文件。

Unity最新版打包AssetBundle和加载的方法的更多相关文章

  1. Unity 打AssetBundle和加载方案

    一.如何组织assetBundle: unity5以前,打包需要自己去找依赖,然后需要按照拓扑图顺序压入AB栈,这样在最后打AB时才能有效利用依赖(栈内已有的AB才能作为依赖). unity5.x后, ...

  2. [Unity] unity5.3 assetbundle打包及加载

    Unity5.3更新了assetbundle的打包和加载api,下面简单介绍使用方法及示例代码. 在Unity中选中一个prefab查看Inspector窗口,有两个位置可以进行assetbundle ...

  3. Unity -- AssetBundle(本地资源加载和加载依赖关系)

    1.本地资源加载 1).建立Editor文件夹 2).建立StreamingAssets文件夹和其Windows的子文件夹 将下方第一个脚本放入Editor 里面 脚本一  资源打包AssetBund ...

  4. AssetBundle资源打包与加载

    AssetBundle资源打包  1.AssetLabels资源标签 文件名:资源打包成AssetBundle后的文件名,类似于压缩包的名字 后缀:自定义 文件名和后缀名都是小写格式(大写会自动转为小 ...

  5. Demo示例——Bundle打包和加载

    Unity游戏里面的场景.模型.图片等资源,是如何管理和加载的? 这就是本文要讲的资源管理方式--bundle打包和加载. 图片 Unity游戏资源管理有很多方式: (1)简单游戏比如demo,可以直 ...

  6. Unity3d 5.x AssetBundle打包与加载

    1.AssetBundle打包 unity 5.x版本AssetBundle打包,只需要设置好AssetBundle的名称后,unity会自动将其打包,无需处理其他,唯独需要做的是设置好个AssetB ...

  7. Unity3D AssetBundle的打包与加载

    在Unity项目开发过程中,当要做热更新时常常使用一个叫做AssetBundle的东西,这里做一点个人的学习记录 步骤1: 设置打包标签:具体步骤----进入Unity,选择某一资源然后看右下角,在那 ...

  8. 实力封装:Unity打包AssetBundle(一)

    说明:这是一系列循序渐进的教程,今天先介绍最简单的AssetBundle打包方式. 这是一个由在Unity中需要加载模型而引发出来的一系列坑,为了填坑花了不少时间,如果有需要在Unity中自定义菜单, ...

  9. AssetBundle压缩/内部结构/下载和加载

    一.AssetBundle的压缩方式   Unity支持三种AssetBundle打包的压缩方式:LZMA, LZ4, 以及不压缩.    1.LZMA压缩方式  是一种默认的压缩形式,这种标准压缩格 ...

随机推荐

  1. Python中字典和集合的用法

    本人开始学习python 希望能够慢慢的记录下去 写下来只是为了害怕自己忘记. python中的字典和其他语言一样 也是key-value的形式  利用空间换时间 可以进行快速的查找 key 是唯一的 ...

  2. c++的const总结

    转自:http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777416.html 为什么使用const?采用符号常量写出的代码更容易维护:指 ...

  3. Build Castles(构建城堡)

    Charlemagne, the King of Frankie, 英文描述 请参考图片中的说明. 中文描述 根据给出的数组确定能够盖多少城堡. 思路和点评 我不能确定我的思路是正确的,也欢迎大家参与 ...

  4. linux文件系统(一)

    linux的文件系统以及文件类型一.linux 文件系统: 根文件系统(rootfs) rootfilesystem /etc,/usr,/var,/home,/dev 系统自我运行必须用到的路径:( ...

  5. vux,vue 苹果手机使用position:fixed有问题,如何解决

    苹果手机真是各种坑,导致我都想摔手机呀,但没办法,用苹果的人太多,程序员还是继续在坑的路上行走! 上一篇文章介绍了一些组件,就是使用vux可以解决,苹果手机使用position:fixed的问题 给需 ...

  6. React文档(三)介绍JSX

    我们先看看这个变量声明: const element = <h1>Hello, world!</h1>; 这个有趣的标签语法既不是字符串也不是HTML. 这种写法叫做JSX,这 ...

  7. [转]2017年最具价值的十大开源项目!GitHub 年度报告~

    <GitHub 2017 年度报告>GitHub 每年都会在年度盛会中推出数据报告,其中列出了一些年度的数据,包括其网站中最受欢迎的编程语言.开源项目等.那么今年哪些开源项目最具价值呢?我 ...

  8. ASP.NET 后台页面无法识别服务器控件ID

    在学习asp.net 的时候 发现有个页面服务器控件无法识别,提示未知元素 解决方法 将不能识别服务器控件ID 的后台文件 类名改写,重新生成一次. 然后再改回来就可以了.

  9. 配置tomcat允许跨域访问,cors跨域资源共享

    1.导入cors-filter-1.7.jar,java-property-utils-1.9.jar两个jar包 2.在web.xml里配上: <filter> <filter-n ...

  10. 绘图之EasyUI+Highcharts+Django

    前言: 在web开发过程中经常会出现图表展示数据的业务需求,如何把数据通过图表的形式,展示在页面上呢?本文将结合EasyUI.Highcharts.Django做一个简单的图表展示web应用: 一.E ...