YooAsset使用

官方网站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 包。

### Unity YooAsset 使用教程及常见问题解决方案 #### 一、YooAsset 插件简介 YooAsset 是一个用于 Unity3D 的资源管理系统,旨在简化并优化游戏开发中的资源管理流程[^1]。通过集成此工具,开发者可以更高效地管理和分发游戏内的各种资产。 #### 二、安装配置指南 为了开始使用 YooAsset,需先克隆其 GitHub 仓库至本地环境,并按照官方文档完成必要的初始化工作。对于希望进一步扩展功能的应用场景,还可以考虑引入 `GameFramework-at-YooAsset` 这样的增强型框架来辅助实现更多高级特性[^2]。 #### 三、核心概念解析 - **唯一实例ID**: 当某个特定的对象被包含在一个已经被加载的 AssetBundle 中时,它会被赋予独一无二的有效实例 ID;然而需要注意的是,Unity 默认情况下并不会自动处理子 AssetBundle 的加载逻辑——这意味着如果存在依赖关系,则必须手动编写代码来进行相应的资源获取操作[^3]。 - **纹理质量控制**: 部分开发者可能会遇到图像显示效果不佳的情况,尤其是在调整了材质分辨率之后发现最终呈现结果不如预期那样清晰锐利。这通常是因为在打包过程中丢失了一些重要的元数据或是因为平台差异而导致渲染行为有所变化所致[^4]。 - **重复对象管理**: 如果不小心执行了错误的操作顺序(比如先卸载了 AssetBundle 却保留着已经实例化的物体),那么就可能出现内存泄漏的风险:即同一个实体会在不同时间点上存在于多个地方而不易察觉。为了避免这种情况的发生,建议始终遵循最佳实践指导原则去设计自己的资源生命周期策略[^5]。 #### 四、实战技巧分享 针对上述提到的一些潜在挑战,这里给出几个实用的小贴士: - 对于复杂的项目结构来说,提前规划好各个模块之间的相互作用非常重要; - 定期清理不再使用的缓存文件有助于保持良好的性能表现; - 利用调试模式下的日志输出可以帮助快速定位到具体的问题所在位置; - 掌握如何正确运用异步编程模型能够显著提升用户体验流畅度。 ```csharp // 加载单个 asset bundle 示例 public IEnumerator LoadSingleAssetBundle(string path, Action<AssetBundle> callback) { var request = AssetBundle.LoadFromFileAsync(path); yield return request; if (request.isDone && !string.IsNullOrEmpty(request.error)) Debug.LogError($"Failed to load assetbundle from {path}: " + request.error); callback?.Invoke(request.assetBundle); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值