assetbundle 使用步骤: 在unity面板材质右下角,选择是否assetbundle,指定路径,然后代码创建打包类,然后可视化在控制面版生成menuitem ,点击开始打包。
创建一个打包类,代码:
using UnityEditor; using system.io; //引用unityEditor 需要将脚本创建在Editor文件夹下 ,
[menuitem("Assets/Build AssetBundles")] //可视化控制面板
public class CreatAssetBundles(){
static void BuildAllAsset(){
string dir="AssetBundle"
if(directory.Exit(dir)==false)
{
directory.CreatDirectory(dir)
}
buildPipeline.BuildAssetbundles(dir,buildoptions.none, buildtarget.windows64)
}
}}
加载的方法 ,加载本地文件里的ab包,
Assetbundle ab=Assetbundle.LoadFromFile("Assetbundle/Scene/wall.unity3d"); // 从文件夹加载资源包
GameObject wallpfef=ab.loadAsset<GameObject>("Cubewall"); //加载物体资源, 从ab包加载
instantiate(wallpref);
加载单个资源泛型, 加载所有loadAllAssets(), 返回uniyt.object数组 , getAllAssetName获取所有资源名字
安卓平台,需要添加上级目录 :string path = Application.dataPath+"Assetbundle/Scene/wall.unity3d";
卸载AB包,减少内存占用, asset.unload(false) ; false是不卸载被其他物体使用的材质, true是全部卸载
进一步减少包的大小: 打包的时候,先打包共享资源,然后其他的只需要引用不打包。
比如两个模型不一样的墙 共用一个材质和贴图 , 如果先把材质贴图打包,这墙打包的时候只需要地址指向,不再次打包材质贴图 , 如果不把材质贴图先打包,独立打包两种墙, 则每个墙都会把材质贴图包含在内打包,就大了
包的依赖关系, 墙依赖材质贴图的包,所以墙的的preb包和材质包都要加载,不然会丢失材质 。