官方网站:https://www.yooasset.com/docs/1.5.x/guide-runtime/CodeTutorial1
本篇文章仅用来记录自己使用YooAseet遇到的问题
1.YooAsset支持打多个Package
单机运行模式下,是从StreamingAssets下加载资源的,利用YooAsset编辑器打包后自动构建StreamingAssets文件夹。并且是可以支持加载多个包的。
编辑器截图:
这里有两个包,打包时两个包各打一次。
代码示例:
void Start()
{
YooAssets.Initialize();
StartCoroutine(InitPackage());
}
private IEnumerator InitPackage()
{
var package = YooAssets.GetPackage("DefaultPackage");
if (package == null)
{
package = YooAssets.CreatePackage("DefaultPackage");
YooAssets.SetDefaultPackage(package);//这一句不是必要的
}
var playMode = EPlayMode.OfflinePlayMode;
InitializationOperation initializationOperation = null;
// 单机运行模式
if (playMode == EPlayMode.OfflinePlayMode)
{
var createParameters = new OfflinePlayModeParameters();
initializationOperation = package.InitializeAsync(createParameters);
}
yield return initializationOperation;
if (initializationOperation.Status == EOperationStatus.Succeed)
{
Debug.Log("资源包初始化成功!");
StartCoroutine(LoadPicture(package));
}
else
Debug.LogError($"资源包初始化失败:{initializationOperation.Error}");
//===========================================================================
var package1 = YooAssets.GetPackage("DefaultPackage2");
if (package1 == null)
{
package1 = YooAssets.CreatePackage("DefaultPackage2");
YooAssets.SetDefaultPackage(package1);
}
var playMode1 = EPlayMode.OfflinePlayMode;
InitializationOperation initializationOperation1 = null;
// 单机运行模式
if (playMode1 == EPlayMode.OfflinePlayMode)
{
var createParameters = new OfflinePlayModeParameters();
initializationOperation1 = package1.InitializeAsync(createParameters);
}
yield return initializationOperation1;
if (initializationOperation1.Status == EOperationStatus.Succeed)
{
Debug.Log("资源包初始化成功!");
StartCoroutine(LoadPicture1(package1));
}
else
Debug.LogError($"资源包初始化失败:{initializationOperation.Error}");
}
IEnumerator LoadPicture(ResourcePackage package)
{
AssetOperationHandle handle = package.LoadAssetAsync<Sprite>("picture1");
yield return handle;
Sprite obj = handle.AssetObject as Sprite;
GameObject picture = new GameObject("picture1");
SpriteRenderer renderer = picture.AddComponent<SpriteRenderer>();
renderer.sprite = obj;
}
IEnumerator LoadPicture1(ResourcePackage package)
{
AssetOperationHandle handle = package.LoadAssetAsync<Sprite>("picture2");
yield return handle;
Sprite obj = handle.AssetObject as Sprite;
GameObject picture = new GameObject("picture2");
SpriteRenderer renderer = picture.AddComponent<SpriteRenderer>();
renderer.sprite = obj;
}
2.资源概念相关
资源包的定义
YooAsset里的资源包,也就是默认包这一类,用于组织和管理一组AB包及其元数据(如依赖关系和版本信息、资源清单等),通过资源包,YooAsset 可以统一管理这些 AB 包的加载、卸载和依赖解析。
AB包的定义
AB包是底层文件单元,存储具体的资源,包含一组资源和其依赖关系的序列化数据。每个AB包通常包含多个资源(如材质、纹理、预制体等),并支持依赖其他的AB包。
资源包和AB包的联系
一个资源包可以包含多个 AB 包,以及这些 AB 包的元信息。YooAsset 的资源加载是基于AB包的。资源包通过清单文件管理一组AB包及其依赖关系
通过ResourcePackage.LoadAssetSync(string location, System.Type type)
方法去加载资源进内存
3.工作流程
打包过程
使用 YooAsset 提供的打包工具,将指定资源打包成多个 AB 包,同时生成一个资源清单文件(Manifest),清单文件记录了资源与 AB 包的对应关系、依赖信息和版本号。
资源包初始化
var createParameters = new OfflinePlayModeParameters();
initializationOperation = package.InitializeAsync(createParameters);
InitializeAsync 方法会加载并解析资源清单文件。
清单文件记录了每个资源对应的 AB 包路径及依赖信息。
在 OfflinePlayMode 下,资源包会直接使用本地的 AB 包。
资源加载
AssetOperationHandle handle = package.LoadAssetAsync<Sprite>("picture1");
YooAsset 会通过清单文件找到 picture1对应的 AB 包,并加载它。
如果资源依赖其他 AB 包,YooAsset 会自动解析并加载依赖的 AB 包。
资源卸载
handle.Release();
资源对应ProviderBase
,每个资源都一个引用计数,当调用 AssetOperationHandle.Release()
方法时,对应资源的引用计数减少。如果资源引用计数归零,该资源会被释放。
AB包对应BundleLoaderBase
,每个AB包都有一个引用计数,该引用计数的增加和减少是与其资源是否被引用有关,资源可能被直接引用或者被其他资源包所依赖引用,当该引用计数为0的时候,AB包会被卸载。
可以通过ResourcePackage.UnloadUnusedAssets();
方法强制卸载所有引用计数为0的AB包,一般在切换场景时调用该方法。
YooAsset 会检查:
如果没有其他资源依赖该 AB 包,则卸载该 AB 包。