Unity HTFramework框架Resource资源管理器

Posted 神码编程

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity HTFramework框架Resource资源管理器相关的知识,希望对你有一定的参考价值。

更新日期:2019年9月26日。
Github源码:[点我获取源码]
Gitee源码:[点我获取源码]

索引

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资源管理器

Unity HTFramework框架(二十一)Debug调试器

Unity HTFramework框架(四十三)标准化命名

Unity HTFramework框架(四十)Debug的性能监控