目录
1.AssetBundleVariant介绍
AssetBundleVariant是Unity的AB变体技术,常用于制作LOD资源,用于适配多档机型性能优化策略,是非常好用的一种资源分级技术,帮助项目对资源的分类编辑、管理、构建、发布提供了极大的便利性。
AssetBundleVariant的最终存在形式,还是AB,例如hight、default、low三种变体,构建后得到的是ab.high、ab.default、ab.low三个ab,把后缀作为变量传入加载即可实现多档机型的AB资源使用管理了。
2.如何制作AssetBundleVariant
制作AssetBundleVariant非常简单。下面以制作p1.png的三档资源为例。
2.1 准备3档LOD资源
对于一张贴图p1.png,如果制作3种变体资源,首先要保证产出3份命名相同的p1.png并且目录不同,目的是为了从ab中加载Asset的时候使用相同的资源名。
2.2 设置ab名以及variant名
在每张贴图的右下角Inspector处设置AssetBundleName和VariantName即可。
2.3 构建AssetBundle的变体
构建很简单,直接看代码:
[@MenuItem("Tools/BuildAB")]
public static void BuildAB()
{
BuildPipeline.BuildAssetBundles(Application.streamingAssetsPath, BuildAssetBundleOptions.UncompressedAssetBundle | BuildAssetBundleOptions.StrictMode, BuildTarget.StandaloneWindows);
AssetDatabase.Refresh();
}
构建结束后,得到3个ab,分别是3个Variant对应的ab。
3.使用代码加载各LOD档资源
加载也很简单,直接看代码:
using UnityEngine;
using UnityEngine.UI;
public class TestLoadABVariant : MonoBehaviour
{
public Image image;
AssetBundle ab;
string abName = "ab_p1";
private void OnGUI()
{
if (GUILayout.Button("Set_H"))
{
string variantName = "h";
LoadAndSetSprite(variantName);
}
if (GUILayout.Button("Set_D"))
{
string variantName = "d";
LoadAndSetSprite(variantName);
}
if (GUILayout.Button("Set_S"))
{
string variantName = "s";
LoadAndSetSprite(variantName);
}
}
private void LoadAndSetSprite(string variantName)
{
if (ab != null)
{
ab.Unload(true);
}
ab = AssetBundle.LoadFromFile($"{Application.streamingAssetsPath}/{abName}.{variantName}");
Sprite s = ab.LoadAsset<Sprite>("p1");
image.sprite = s;
image.rectTransform.sizeDelta = new Vector2(s.texture.width, s.texture.height);
}
}
4.使用代码构建AssetBundleVariant
需要注意,只要这个ABName使用了Variant,那么此AB的其他Variant就不能为""空字符串。
var assetBundleBuilds = new AssetBundleBuild[]
{
new AssetBundleBuild
{
assetBundleName = "ab_p",
assetBundleVariant = "H",
assetNames = new string[] { "Assets/H/p.png" }
},
new AssetBundleBuild
{
assetBundleName = "ab_p",
assetBundleVariant = "", // <- Cause error
assetNames = new string[] { "Assets/D/p.png" }
}
};
BuildPipeline.BuildAssetBundles(outputPath, assetBundleBuilds, BuildAssetBundleOptions.None, BuildTarget.Android);
AssetBundleVariant的使用方法介绍,到此全部完成。