YooAsset:十三、资源加载

学习资源加载的使用方法。

一、加载方法

  • LoadSceneAsync(): 异步加载场景
  • LoadAssetSync() :同步加载资源对象
  • LoadAssetAsync() :异步加载资源对象
  • LoadSubAssetsSync() :同步加载子资源对象
  • LoadSubAssetsAsync() :异步加载子资源对象
  • LoadAllAssetsSync() :同步加载资源包内所有资源对象
  • LoadAllAssetsAsync(): 异步加载资源包内所有资源对象
  • LoadRawFileSync(): 同步获取原生文件
  • LoadRawFileAsync(): 异步获取原生文件

二、统一约定

public AssetHandle LoadAssetAsync(string location, uint priority = 0)

1.在未开启可寻址模式下,location代表的是资源对象的完整路径

// 以工程内的音频文件为例:"Assets/GameRes/Audio/bgMusic.mp3" 
package.LoadAssetAsync<AudioClip>("Assets/GameRes/Audio/bgMusic");

2.在开启可寻址模式下,location代表的是资源对象可寻址地址

// 以工程内的音频文件为例:"Assets/GameRes/Audio/bgMusic.mp3" 
// 需要在资源配置界面启用可寻址功能(Enable Addressable)。
// 配置界面的可寻址规则为AddressByFileName,那么资源定位地址填写文件名称:"bgMusic"
package.LoadAssetAsync<AudioClip>("bgMusic");
注意:
可寻址模式下,也支持使用完整的资源路径来加载。

三、加载路径的匹配

// 不带扩展名的模糊匹配
package.LoadAssetAsync<AudioClip>("Assets/GameRes/Audio/bgMusic");

// 带扩展名的精准匹配
package.LoadAssetAsync<AudioClip>("Assets/GameRes/Audio/bgMusic.mp3");

四、异步加载的方式

1.委托加载方式

// 委托加载方式
void Start()
{
    AssetHandle handle = package.LoadAssetAsync<AudioClip>("Assets/GameRes/Audio/bgMusic.mp3");
    handle.Completed += Handle_Completed;
}
void Handle_Completed(AssetHandle handle)
{
    AudioClip audioClip = handle.AssetObject as AudioClip;
}

2.协程加载方式

// 协程加载方式
IEnumerator Start()
{
    AssetHandle handle = package.LoadAssetAsync<AudioClip>("Assets/GameRes/Audio/bgMusic.mp3");
    yield return handle;   
    AudioClip audioClip = handle.AssetObject as AudioClip;
}

3.Task加载方式

// Task加载方式
async void Start()
{
    AssetHandle handle = package.LoadAssetAsync<AudioClip>("Assets/GameRes/Audio/bgMusic.mp3");
    await handle.Task;
    AudioClip audioClip = handle.AssetObject as AudioClip;	
}

五、加载示例

1.预制体加载范例

IEnumerator Start()
{
    AssetHandle handle = package.LoadAssetAsync<GameObject>("Assets/GameRes/Panel/login.prefab");
    yield return handle;
    //通过AssetHandle的InstantiateSync()实例化对象
    GameObject go = handle.InstantiateSync();
    Debug.Log($"Prefab name is {go.name}");
}

2.子对象加载范例

IEnumerator Start()
{
    SubAssetsHandle handle = package.LoadSubAssetsAsync<Sprite>(location);
    yield return handle;
    var sprite = handle.GetSubAssetObject<Sprite>("spriteName");
    Debug.Log($"Sprite name is {sprite.name}");
}

3.资源包内所有对象加载范例

IEnumerator Start()
{
    // 注意:location只需要填写资源包里的任意资源地址。
    AllAssetsHandle handle = package.LoadAllAssetsAsync<UnityEngine.TextAsset>(location);
    yield return handle;
    foreach(var assetObj in handle.AllAssetObjects)
    {    
        UnityEngine.TextAsset textAsset = assetObj as UnityEngine.TextAsset;
    }
}

4.场景异步加载范例

注意:当加载新的主场景的时候,会自动释放之前加载的主场景以及附加场景。
IEnumerator Start()
{
    string location = "Assets/GameRes/Scene/Login";
    var sceneMode = UnityEngine.SceneManagement.LoadSceneMode.Single;
    var physicsMode = LocalPhysicsMode.None;
    bool suspendLoad = false;
    SceneHandle handle = package.LoadSceneAsync(location, sceneMode, physicsMode, suspendLoad);
    yield return handle;
    Debug.Log($"Scene name is {handle.Scene.name}");
}

5.图集精灵加载范例

如何加载SpriteAtlas对象以及包含的精灵。
IEnumerator Start()
{
    string location = "Assets/GameRes/UIAtlas/login.spriteatlas";
    AssetHandle handle = package.LoadAssetAsync(location);
    yield return handle;
    var spriteAtals = handle.AssetObject as SpriteAtlas;
    var spriteObject = spriteAtals.GetSprite("spriteName");
}

6.原生文件加载范例

注意:原生文件必须使用原生构建管线来构建。
例如:wwise的初始化文件
IEnumerator Start()
{
    // 注意:该Package必须是原生文件构建管线构建的资源包裹。
    string location = "Assets/GameRes/wwise/init.bnk";
    RawFileHandle handle = package.LoadRawFileAsync(location);
    yield return handle;
    byte[] fileData = handle.GetRawFileData();
    string fileText = handle.GetRawFileText();
    string filePath = handle.GetRawFilePath();
}

7.配置文件加载范例

// 自定义的配置文件
public class MyGameConfig: ScriptableObject
{
    ...
}

IEnumerator Start()
{
    string location = "Assets/GameRes/config/gameConfig.asset";
    AssetHandle handle = package.LoadAssetAsync(location);
    yield return handle;
    MyGameConfig gameCOnfig = handle.AssetObject as MyGameConfig;
}

8.热更脚本加载范例

如果使用的是Lua或者ILRuntime,HybirdCLR热更方式,可以将Lua或者Hotfix.dll的文件格式修改为.bytes
IEnumerator Start()
{
    AssetHandle handle = package.LoadAssetAsync<TextAsset>("Assets/GameRes/Hotfix.bytes");
    yield return handle;
    TextAsset textAsset = handle.AssetObject as TextAsset;
    //textAsset.bytes 二进制数据
    //textAsset.text 文本数据
}

六、获取资源信息列表

1.通过资源标签来获取资源信息列表

void GetAssetInfosByTag(string tag)
{
    AssetInfo[] assetInfos = package.GetAssetInfos(tag);
    foreach (var assetInfo in assetInfos)
    {
        Debug.Log(assetInfo.AssetPath);
    }
}

2.获取所有的资源信息列表

void GetAllAssetInfos()
{
    AssetInfo[] assetInfos = package.GetAllAssetInfos();
    foreach (var assetInfo in assetInfos)
    {
        Debug.Log(assetInfo.AssetPath);
    }
}

七、检测资源是否需要更新下载

{
    bool isNeedDownload = package.IsNeedDownloadFromRemote(location);
}

<think>嗯,用户想了解YooAssetUnity中的资源管理方法,包括使用方法和教程。首先,我需要回忆一下之前提供的引用内容,确保信息准确。引用[1]提到YooAsset可以处理依赖、版本控制,简化AssetBundle的使用。引用[2]和[3]详细说明了YooAsset如何与HybridCLR配合,以及打包、部署的步骤。 用户可能需要一个结构化的教程,分步骤讲解如何使用YooAsset。我应该从安装开始,引用[1]提到通过Packages清单安装,需要具体说明如何操作。然后是配置,比如资源模式的选择,单机或联机模式的区别,这部分引用[3]有提到。 接下来是资源打包,用户需要知道如何设置标签,构建AssetBundle,引用[3]中的步骤1和2相关。然后是部署资源到服务器,引用[3]提到放入腾讯云存储桶,可能需要指导如何修改代码配置服务器地址。 资源加载部分,引用[3]提到异步和同步加载,需要给出代码示例,比如使用LoadAssetSync或LoadAssetAsync。版本更新和热更也是重点,引用[2]和[3]都提到与HybridCLR配合,这里需要说明如何检测版本和下载更新。 最后,注意事项和常见问题,比如路径设置、标签管理,引用[3]里提到的资源定位和冗余分析。用户可能遇到的坑需要提前预警,比如依赖处理或版本回退,引用[1]和[3]的相关内容。 还要确保回答符合系统指令,比如数学公式的正确使用,但这里可能用不到。需要生成相关问题,引导用户进一步探索,比如性能优化、热更实现、与AssetBundle对比等。确保引用标记正确,比如[^1][^2][^3]放在对应的信息后面,保持自然。</think>以下为YooAssetUnity中的资源管理方法及使用教程详解: ### 一、核心功能特性 YooAsset通过$AssetBundle$封装简化了资源管理流程,提供以下核心功能: $$资源冗余分析 = f(标签系统)$$ $$热更新机制 = \sum_{版本检测}^{资源差异} 增量下载$$ 支持内置/可编程渲染管线、分工程构建、灰度更新等特性[^3] ### 二、使用流程(单机模式) 1. **安装配置** ```csharp // Packages清单添加 "com.tuyoogame.yooasset": "https://github.com/tuyoogame/YooAsset.git" ``` 需通过Unity Package Manager安装(引用[1]) 2. **初始化配置 ```csharp // 初始化资源系统 YooAssets.Initialize(); var package = YooAssets.CreatePackage("DefaultPackage"); YooAssets.SetDefaultPackage(package); // 资源模式选择 var initParameters = new OfflinePlayModeParameters(); package.InitializeAsync(initParameters).ToUniTask().Forget(); ``` 3. **资源打包 ```python # 构建流程伪代码 if __name__ == "____YooAsset__": 设置构建参数 -> 分析资源依赖 -> 生成补丁清单 -> 输出AssetBundle ``` 需通过编辑器菜单`YooAsset -> AssetBundle Builder`执行(引用[3]) 4. **资源加载 ```csharp // 同步加载示例 var handle = package.LoadAssetSync<GameObject>("Assets/Prefabs/Character.prefab"); var instantiatedObj = handle.InstantiateSync(); // 异步加载示例 var operation = package.LoadAssetAsync<Texture2D>("Assets/Textures/Icon.png"); yield return operation; ``` ### 三、联机模式扩展 1. 资源部署架构: $$ CDN服务器 \xrightarrow{HTTPS} 客户端版本比对 \xrightarrow{差分下载} 本地缓存 $$ 需将构建产物上传至云存储(如腾讯云COS)(引用[3]) 2. 服务器配置 ```csharp // 修改HostPlayModeParameters var initParameters = new HostPlayModeParameters(); initParameters.RemoteServices.RemoteMainURL = "https://your-cdn-domain.com/"; ``` ### 四、热更新实现 ```mermaid graph TD A[启动检测版本] --> B{需要更新?} B -->|是| C[下载补丁清单] C --> D[计算差异文件] D --> E[并行下载资源] E --> F[更新完成] B -->|否| F ``` ### 五、注意事项 1. 资源路径需使用完整路径(如`Assets/Textures/Icon.png`) 2. 标签系统是资源分类的关键,建议按功能模块划分 3. 联机模式需处理下载失败重试机制 4. 版本回退功能需保留历史版本清单(引用[3])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值