AssetBundle 神器之 XAsset 管理AB包
“XASSET杀人越货居家旅行必备框架。”
XASSET 4.0 主要为有资源版本更新需求的Unity项目提供了一个更精简、高效、安全的资源管理方案.
XASSET 5.1为Unity项目提供了可以快速投入到生产环境中使用的具有更智能和灵活的资源分包、热更新机制和稳健高效的资源加载和内存管理的资源管理方案。它不仅可以服务于快速生产以及更有针对性的高效出包,更能在一些细微之处为你的项目保驾护航.
https://zhuanlan.zhihu.com/p/69410498
https://www.bilibili.com/video/BV1wE411y7yU
https://blog.****.net/dengshunhao/article/details/80486774
打AB包
1,2打完了AB包再打工程包。
加载包示例:
public void Init(bool isHero, int heroID)
{
CurTid = heroID;
StartCoroutine (InitData(heroID));
}
//void InitData(int heroID)
IEnumerator InitData(int heroID)
{
//原来这里是同步加载资源
//UnityEngine.Object UIHeroSkillCellPrefeb = ResourcesLoader.Load("UI/prefab/UIHeroSkillCell");
//skillDict = new Dictionary<int, GameObject>()
//{
// {0, (GameObject) GameObject.Instantiate(UIHeroSkillCellPrefeb)},
// {1, (GameObject)GameObject.Instantiate(UIHeroSkillCellPrefeb)},
// {2, (GameObject) GameObject.Instantiate(UIHeroSkillCellPrefeb)},
// {3, (GameObject)GameObject.Instantiate(UIHeroSkillCellPrefeb)}
//};
//为了WebGL,前面的资源加载方式由同步改为异步
yield return PreloadResources();
//...
}
/// <summary>
/// 异步加载资源
/// </summary>
/// <returns></returns>
private IEnumerator PreloadResources()
{
//ResourcesLoader.Load
prefabSkillCell = ResourcesManager.LoadAsync<GameObject>("UI/prefab/UIHeroSkillCell");
yield return prefabSkillCell;
UnityEngine.Object UIHeroSkillCell = prefabSkillCell.asset;
skillDict = new Dictionary<int, GameObject>()
{
{0, (GameObject) GameObject.Instantiate(UIHeroSkillCell)},
{1, (GameObject)GameObject.Instantiate(UIHeroSkillCell)},
{2, (GameObject) GameObject.Instantiate(UIHeroSkillCell)},
{3, (GameObject)GameObject.Instantiate(UIHeroSkillCell)}
};
yield return null;
}
// 前面 Load 和 这里资源回收Release 须配对使用
void OnDestroy()
{
if (prefabSkillCell != null)
{
prefabSkillCell.Release();
prefabSkillCell = null;
}
}
资源回收
xasset 内建了基于引用计数的资源内存管理机制,这种机制下,已经加载的资源不会重复加载,只是资源的引用计数会+1。如果资源的引用计数 > 1, 执行 AssetRequest.Release 也只是减少一次引用计数,当资源的引用计数为 0 的时候,这个资源就会被底层回收,所以写业务的时候 Load 和 Release 是需要配对使用的。
需要注意的是,一些人可能会对 Object.Instantiate 实例化的对象和 Assets.Load 出来的对象存在这样的误解:用Assets.Load 出来的 GameObject 在实例化后,直接 Destroy 实例化后的这个 GameObject,Assets.Load 的 GameObject 就会回收。
然而,实际情况并不是这样的。Object.Instantiate 的对象需要用 Object.Destroy 来回收,并且这个对象 Destroy 之后不等于相关的使用 Assets.Load 出来的资源会回收,对于 Assets.Load 出来的资源你只能通过对应的 Release 接口来回收。