Unity HTFramework框架Resource资源管理器
Posted 神码编程
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity HTFramework框架Resource资源管理器相关的知识,希望对你有一定的参考价值。
索引
Resource资源管理器简介
Resource资源管理器主要用于动态加载资源(只支持异步加载),在加载中或加载完成后都可以进行自定义操作,现在主要支持Resource加载和AssetBundle加载,比如,UI模块就会自动调用资源管理器加载UI实体。
目前资源的加载策略是单线加载,如果有多个请求同时下载资源,只有第一个请求会下载资源,其他请求会挂起等待,直到当前请求完成,再按序下载。这样做的好处是如果有多个请求同时下载一个资源包时,挂起其他请求,只下载一次,在下载完成后其他请求会首先从下载缓存中读取自己需要的资源,如果没有再重新下载。
使用Resource资源管理器
设置资源加载模式
没错,Resource加载模式就是直接从Resources文件夹加载,使用Resource加载模式请确认资源存在于Resources文件夹下的路径。
使用AssetBundle加载模式时:
1、必须提供Manifest Name(AB包清单名称,也即是AB包打包完成后,里面会自动生成的一个清单文件的名称);
2、Editor Mode表明是否使用编辑器模式(编辑器模式会忽略AB包限制,直接通过路径加载资源,此属性在项目发布出去后会自动无效);
默认情况下,AssetBundle的加载根路径是StreamingAssetsPath,如果资源需要通过网络加载,请在初始化时指定资源的网络加载根路径。(推荐的方式是:将AB包下载到本地,再使用资源本地加载)
//也可以设置资源下载根路径为网络地址
Main.m_Resource.SetAssetBundlePath("http://192.168.0.100/Test/ABs/");
浏览所有Resources文件夹
使用Resource加载模式,可以点击面板按钮Resources Folder View浏览工程目录下所有的Resources文件夹,并查看其中的所有资源文件,因为Resources文件夹中的文件都会被打入运行包,所以可以在此处查看是否有深度隐藏的Resources文件夹被悄悄打入运行包导致冗余资源。
在Resources Folder View面板点击指定的资源,可以在Project窗口立即定位到该资源文件。
加载常规资源
加载Unity常规资源(除GameObject、Scene外的其他资源)使用以下方法完成:
public Coroutine LoadAsset<T>(AssetInfo info, Action<float> loadingAction, Action<T> loadDoneAction)
每一个常规资源由一个AssetInfo对象标记,例如,加载一个图片:
//常规资源信息,请注意第二个参数需要提供资源在工程中的全路径,以便于在Editor模式能正确加载该资源
private AssetInfo _asset = new AssetInfo("UI","Asset/Image/Test.png", "Image/Test");
private void Start()
//加载 Test.png
Main.m_Resource.LoadAsset<Sprite>(_asset, Loading, LoadDone);
/// <summary>
/// 加载中
/// </summary>
/// <param name="progress"></param>
private void Loading(float progress)
//获取加载界面
UILoading loading = Main.m_UI.GetOpenedUI<UILoading>();
if (loading != null)
//更新加载进度
loading.UpdateProgress(progress);
/// <summary>
/// 加载完成
/// </summary>
/// <param name="sprite">图片</param>
private void LoadDone(Sprite sprite)
Image image = GetComponent<Image>();
image.sprite = sprite;
加载预制体
预制体不同于其他通用资源,他们常常可以直接使用,并且类型都是GameObject,加载预制体使用以下方法完成:
注意:参数isUI默认为false,如果加载的预制体是UGUI对象时,会有特殊处理。
public Coroutine LoadPrefab(PrefabInfo info, Transform parent, Action<float> loadingAction, Action<GameObject> loadDoneAction, bool isUI = false)
每一个预制体由一个PrefabInfo对象标记,例如,加载一个预制体:
//预制体信息,请注意第二个参数需要提供资源在工程中的全路径,以便于在Editor模式能正确加载该预制体
private PrefabInfo _prefab = new PrefabInfo("Obj","Asset/Prefabs/Test.prefab", "Prefabs/Test");
private void Start()
//加载 Test
Main.m_Resource.LoadPrefab(_prefab, transform, Loading, LoadDone);
/// <summary>
/// 加载中
/// </summary>
/// <param name="progress"></param>
private void Loading(float progress)
//获取加载界面
UILoading loading = Main.m_UI.GetOpenedUI<UILoading>();
if (loading != null)
//更新加载进度
loading.UpdateProgress(progress);
/// <summary>
/// 加载完成
/// </summary>
/// <param name="obj">预制体</param>
private void LoadDone(GameObject obj)
obj.SetActive(true);
加载数据集
数据集需要继承至数据集基类DataSet,主要用于存储各种数据,加载数据集使用以下方法完成:
注意:只用于加载事先内置在编辑器中的数据集,动态创建的数据集不需要再加载。
public Coroutine LoadDataSet<T>(DataSetInfo info, Action<float> loadingAction, Action<T> loadDoneAction)
每一个数据集由一个DataSetInfo对象标记,例如,加载一个数据集:
//数据集信息,请注意第二个参数需要提供资源在工程中的全路径,以便于在Editor模式能正确加载该数据集
//第四个参数为用于初始化此数据集的JSON数据,为空则保持数据集默认数据
private DataSetInfo _dataSet = new DataSetInfo("Obj","Asset/DataSet/Test.asset", "DataSet/Test", null);
private void Start()
//加载 Test
Main.m_Resource.LoadDataSet<MainDataSet>(_dataSet, Loading, LoadDone);
/// <summary>
/// 加载中
/// </summary>
/// <param name="progress"></param>
private void Loading(float progress)
//获取加载界面
UILoading loading = Main.m_UI.GetOpenedUI<UILoading>();
if (loading != null)
//更新加载进度
loading.UpdateProgress(progress);
/// <summary>
/// 加载完成
/// </summary>
/// <param name="obj">数据集</param>
private void LoadDone(MainDataSet asset)
//将数据集保存到数据集仓库
Main.m_DataSet.AddDataSet(asset);
加载场景
由于框架的策略:其他场景只支持AB包动态加载,所以这里加载场景时必须使用AssetBundle模式:
public Coroutine LoadScene(SceneInfo info, Action<float> loadingAction, Action loadDoneAction)
每一个场景资源由一个SceneInfo 对象标记,例如,加载一个场景Level1:
//场景资源信息,请注意第二个参数为场景名称
private SceneInfo _asset = new SceneInfo("scene","Level1");
private void Start()
//加载 Level1
Main.m_Resource.LoadScene(_asset, Loading, null);
/// <summary>
/// 加载中
/// </summary>
/// <param name="progress"></param>
private void Loading(float progress)
//获取加载界面
UILoading loading = Main.m_UI.GetOpenedUI<UILoading>();
if (loading != null)
//更新加载进度
loading.UpdateProgress(progress);
卸载资源
理论上只支持卸载AssetBundle资源:
//卸载名为 UI 的 AssetBundle
Main.m_Resource.UnLoadAsset("UI");
//卸载所有 AssetBundle
Main.m_Resource.UnLoadAllAsset();
运行时检视面板
在编辑器中运行时将会出现运行时检视面板(Runtime Data),主要用以调试或数据监测,目前面板如下:
1.如果在AssetBundle加载模式下,这里会显示当前加载到工程中的所有AB包信息。
以上是关于Unity HTFramework框架Resource资源管理器的主要内容,如果未能解决你的问题,请参考以下文章
Unity HTFramework框架(十六)AssetBundleEditor打包工具
Unity HTFramework框架StepEditor步骤编辑器(下)
Unity HTFramework框架Resource资源管理器