1.新建工程,新建Editor目录,创建打包脚本CreateAssetbundles.cs
using UnityEditor;
using System.IO;
public class CreateAssetbundles {
[MenuItem("AssetsBundle/Build AssetBundles")]
static void BuildAllAssetBundles()//进行打包
{
string dir = "AssetBundles";
//判断该目录是否存在
if (Directory.Exists(dir) == false)
{
Directory.CreateDirectory(dir);//在工程下创建AssetBundles目录
}
//参数一为打包到哪个路径,参数二压缩选项 参数三 平台的目标
BuildPipeline.BuildAssetBundles(dir, BuildAssetBundleOptions.None,BuildTarget.StandaloneWindows64);
}
}
Unity目录会出现AssetBundle选项,点击打包所有的ab包
创建两个Image,
分别使用不同的图片,并创建预制体Image1,Image2。
Image1和Image2使用同一张图BossPortrait_01,Image2的子物体使用另一张图片 BossPortrait_03
2.Image1设置AssetBundle为scene/image1.ab,Image2设置AssetBundle为scene/image2.ab
3.为处理依赖打包,我们应该先打包image1和image2公用的BossPortrait_01图片资源,命名为scene/allimage.ab
4.
先把所依赖的材质和贴图单独打包到一个文件夹中,然后再分别打包两个需要依赖这个材质和贴图的模型。这样Unity就会去查找这个材质贴图,发现这个材质和贴图已经打包了出来,那么它就不会去重复的打包材质和贴图了,这样就大大减小了包的大小
依赖打包后的allimage+image1+image2的大小31k 加载image1和image2资源要先加载依赖的资源allimage
不使用依赖打包的image1+image2的大小42k
加载3种方式
1.LoadFromMemoryAsync 内存加载
using System.Collections;
using UnityEngine;
using System.IO;
public class LoadFromFileExample : MonoBehaviour
{
IEnumerator Start () {
string path = "AssetBundles/scene/model.ab";
//第一种加载AB的方式 LoadFromMemoryAsync
//异步加载
AssetBundleCreateRequest request = AssetBundle.LoadFromMemoryAsync(File.ReadAllBytes(path));
yield return request;
AssetBundle ab = request.assetBundle;
Object obj1 = ab.LoadAsset<GameObject>("Cube");//加载出来放入数组中
Instantiate(obj1);
}
}
2.LoadFromFile 本地加载
using UnityEngine;
using System.Collections;
public class LoadFromFileExample : MonoBehaviour {
IEnumerator Start () {
string path = "AssetBundles/scene/model.ab";
//第二种加载方式 LoadFromFile
//异步加载
AssetBundleCreateRequest request = AssetBundle.LoadFromFileAsync(path);
yield return request;
AssetBundle ab = request.assetBundle;
//使用里面的资源
Object[] obj = ab.LoadAllAssets<GameObject>();//加载出来放入数组中
// 创建出来
foreach (Object o in obj)
{
Instantiate(o);
}
}
}
3.UnityWbRequest 远程加载
using System.Collections;
using UnityEngine;
using UnityEngine.Networking;
public class LoadFromFileExample : MonoBehaviour
{
IEnumerator Start () {
string uri = @"file:///F:\AssetBundles\scene\model.ab";
// string uri = @"http://localhost/AssetBundles\model.ab";
UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(uri);
yield return request.Send();
AssetBundle ab = DownloadHandlerAssetBundle.GetContent(request);
//使用里面的资源
Object[] obj = ab.LoadAllAssets<GameObject>();//加载出来放入数组中
// 创建出来
foreach (Object o in obj)
{
Instantiate(o);
}
}
}
Unity Asset Bundle Browser tool工具下载链接:
https://github.com/Unity-Technologies/AssetBundles-Browser
直接拖入unity工程