1.同步加载
现在有一个名为"model"的包,里面有一个Cube模型资源
脚本:
public class ABTest : MonoBehaviour
{
void Start()
{
//第一步:加载AB包
// 注意:同一AB包不能重复加载,否则报错
// 传入AB包的路径(因为Build时勾选了"Copy to StreamingAssets",所以直接从此路径加载)
AssetBundle ab = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + "model");
//第二步:加载AB包中的资源
// 只使用资源名加载 会出现同名不同类型资源分不清楚
// 建议使用泛型 或 Type指定类型加载
GameObject obj = ab.LoadAsset<GameObject>("Cube");
//实例化查看
Instantiate(obj);
}
}
运行:
2.异步加载
public class ABTest : MonoBehaviour
{
void Start()
{
//开启携程
StartCoroutine(LoadABRes("model", "Cube"));
}
/// <summary>
/// 异步加载AB包资源
/// </summary>
/// <param name="ABName">包名</param>
/// <param name="resName">资源名</param>
/// <returns></returns>
IEnumerator LoadABRes(string ABName, string resName)
{
//第一步:加载AB包
AssetBundleCreateRequest abcr = AssetBundle.LoadFromFileAsync(Application.streamingAssetsPath + "/" + ABName);
yield return abcr;//等待加载完
//第二步:加载AB包里的资源
AssetBundleRequest abr = abcr.assetBundle.LoadAssetAsync<GameObject>(resName);
yield return abr; //等待加载完
//第三步:使用资源
// 注意 AssetBundleRequest.asset时万物之父object,使用时要as成对应类型
GameObject obj = abr.asset as GameObject;
Instantiate(obj);
}
}
运行:
3.卸载AB包
卸载所有加载的AB包:
//填true:如果场景中有资源是通过AB包加载的,会一起把它卸载
//填false:只卸载AB包,场景中的资源不受影响,一般填false
AssetBundle.UnloadAllAssetBundles(false);
只卸载自己:
//参数同上
AssetBundle ab = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + "model");
ab.Unload(false);