Unity最新版打包AssetBundle和加载的方法

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

原文地址:https://www.cnblogs.com/huwenya/p/9244868.html

时间: 2024-10-06 20:25:30

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

[Unity]浅谈AssetBundle的依赖关系打包与加载

一.写在前面 通过AssetBundle进行资源管理很方便.AssetBundle的打包与加载策略有很多种,本文来讲一种可以随意通过资源名来加载指定目录下资源的打包方法.意在加深对资源管理的理解. 二.策略介绍 1.打包的粒度划分的策略 ①     所有在指定目录下的文件,即RootList,都被打包成单独结点 ②     对于RootList所依赖的所有资源,即DepList,依赖数大于1的,被打包成单独结点,等于1的,向上合并至被依赖结点. ③     记录打包信息 2.下载策略 ①    

AssetBundle资源打包与加载

AssetBundle资源打包  1.AssetLabels资源标签 文件名:资源打包成AssetBundle后的文件名,类似于压缩包的名字 后缀:自定义 文件名和后缀名都是小写格式(大写会自动转为小写)2. BuildPipeline.BuildAssetBundles(string outputPath, BuildAssetBundleOptions assetBundleOptions, BuildTarget targetPlatform) 打包所有设置了AssetLabel的资源 o

关于unity 中使用AssetBundle加载资源,shader偶尔会丢失的问题解决办法

问题描述: 因为项目中要进行热更新设计,所以用unity官方推荐的打包方式assetbundle进行打包,打包好了以后再电脑上运行正常,但是当发布到android上后发现偶尔场景背景会出现空白,多方查找,发现unity存在使用assetbundle加载资源会丢失shader的问题.网上找了一些解决方式,测试可用,分享出来. 方案一:(亲测可用) 第一步,在将用到的Shader加到Editor->Graphics Settings的Shader列表里再进行打包(依赖打包) 第二步,在代码中给sha

Unity3d 5.x AssetBundle打包与加载

1.AssetBundle打包 unity 5.x版本AssetBundle打包,只需要设置好AssetBundle的名称后,unity会自动将其打包,无需处理其他,唯独需要做的是设置好个AssetBundle的名称. 注意:AssetBunlde的名称只能设置小写字母,即使你写成大写也会被自动转置成大写字母,而且名称中支持"/",如:"AssetBundles/cube.unity3d",.unity3d的后缀是自己设置的,可以不设置 代码: using Unit

【unity系统模块开发】Unity5.5.2UI打包AssetBundle

之前已经有几篇文章写打包AssetBundle,但毕竟没有实际在项目中写过都写的比较浅. 刚好最近项目更新Unity5.5.2就顺便由我来更新ui打包流程 这里就把这次的经验写一下 这里还是稍微解释一下打包的基本目的: 打包ui就是把你做的界面打包出来成assetbundle包,讲道理你就把每个界面打成bundle包在游戏中你就可以直接加载来用,但是这样子的话你的每个bundle包就会非常的大,为什么呢,是因为这样子每个界面的bundle包里都包含这个界面用到的字体,贴图atlas,textur

【小松教你手游开发】【unity系统模块开发】Unity5.5.2UI打包AssetBundle

之前已经有几篇文章写打包AssetBundle,但毕竟没有实际在项目中写过都写的比较浅. 刚好最近项目更新Unity5.5.2就顺便由我来更新ui打包流程 这里就把这次的经验写一下 这里还是稍微解释一下打包的基本目的: 打包ui就是把你做的界面打包出来成assetbundle包,讲道理你就把每个界面打成bundle包在游戏中你就可以直接加载来用,但是这样子的话你的每个bundle包就会非常的大,为什么呢,是因为这样子每个界面的bundle包里都包含这个界面用到的字体,贴图atlas,textur

实力封装:Unity打包AssetBundle(二)

→前情提要:Unity最基本的AssetBundle打包方式. 第二种打包方式 Unity提供的BuildAssetBundles API还有一个重载形式,看下面↓↓ public static AssetBundleManifest BuildAssetBundles(string outputPath, AssetBundleBuild[] builds, BuildAssetBundleOptions assetBundleOptions, BuildTarget targetPlatfo

Unity资源解决方案之AssetBundle

1.什么是AssetBundle AssetBundle是Unity pro提供的一种用来存储资源的文件格式,它可以存储任意一种Unity引擎能够识别的资源,如Scene.Mesh.Material.Texture.Audio.noxss等等,同时,AssetBundle也可以包含开发者自定义的二进制文件,只需要将自定义文件的扩展名改为.bytes,Unity就可以把它识别为TextAsset,进而就可以被打包到AssetBundle中.Unity引擎所能识别的资源我们称为Asset,Asset

【Unity游戏开发】AssetBundle杂记--AssetBundle的二三事

一.简介 马三在公司大部分时间做的都是游戏业务逻辑和编辑器工具等相关工作,因此对Unity AssetBundle这块的知识点并不是很熟悉,自己也是有打算想了解并熟悉一下AssetBundle,掌握一下Unity资源管理方面的知识,因此有了这篇博客. 我会在博客中整理出一些自己学习时收集到的一些比较好的AssetBundle学习资料,并且结合现在正在参与开发的商业项目随时写下一些自己的拙见.本篇博客权当是马三自己的笔记和一些杂谈,会不断地随时随地的更新一些内容. 二.收集整理的一些AssetBu