打包:
资源下方可以指定包和后缀,可以添加目录。
打包某个资源,如果其所依赖的资源没有被打包,那么依赖的资源会被打包到一起,如果多个地方都依赖到了该资源,就会重复占用空间。
物体依赖的贴图、材质等共享的资源需要一并打包。加载时需要先加载依赖资源。
using UnityEditor;
using System.IO;
public class AssetBundleGenerator
{
[MenuItem("Assets/Build AssetBundles")]
public static void GenerateAssetBundles()
{
string dir = "AssetBundle";
if (!Directory.Exists(dir))
{
Directory.CreateDirectory(dir);
}
BuildPipeline.BuildAssetBundles(dir, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows);
}
}
BuildAssetBundleOptions
常用方式:
None: 使用 LZMA 算法压缩,压缩包体小,加载时间长,使用前需要整体解压。下载时使用LZMA算法,解压后会使用LZ4算法重新压缩,保存到本地。
UncompressedAssetBundle: 不压缩
ChunkBasedCompression: 使用LZ4压缩。可以加载指定资源而不用解压全部。加载速度接近不压缩。
加载:
LoadFromMemory
AssetBundleCreateRequest request = AssetBundle.LoadFromMemoryAsync(byte[]);
yield return request;
AssetBundle ab = request.assetBundle;
LoadFromFile
AssetBundleCreateRequest request = AssetBundle.LoadFromFileAsync(path);
yield return request;
AssetBundle ab = request.assetBundle;
UnityWebRequest(从本地/服务器加载皆可)
string url = "";
UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(url);
yield return request.SendWebRequest();
AssetBundle ab = DownloadHandlerAssetBundle.GetContent(request);
加载依赖
基本上只需要用到记录了所有信息的那个manifest
AssetBundle manifestAB = AssetBundle.LoadFromFile("AssetBundle/AssetBundle");
AssetBundleManifest manifest = manifestAB.LoadAsset<AssetBundleManifest>("AssetBundle.manifest");
string[] dependencies = manifest.GetAllDependencies("包名");
//拿到全部包名
//string[] assetBundles = manifest.GetAllAssetBundles();
foreach(var depen in dependencies)
{
AssetBundle.LoadFromFile(depen);
}
卸载ab包
可以在关卡切换等时候卸载,释放空间
//卸载该包所有资源(推荐)
xx.UnLoad(true);
//卸载该包没有被使用的资源(使用该方式reload后是新的资源,原本的未卸载资源遗留在了内存中)
//解决方式:移出所有引用--包括遗物体和脚本,然后调用 Resources.UnloadUnusedAssets()
xx.UnLoad(false);
一个图集的图片尽量打包到一个包里