内部资源加载

介绍

约定资源在Unity项目内部,需要动态加载的资源为项目内部资源

资源加载配置

位于Resources/UNIHper下的resources.json文件为UNIHper框架的资源加载配置文件,框架会根据此配置文件进行资源的管理,对三种资源加载方式均做了支持,目前Unity较新的资源加载方案为Addressable方式。

按如下规则配置的相关资源,则会在框架启动时进行资源加载。随后则可以使用Managements.Resoure.Get接口获取相应资源

resources.json
{
    // 持久层资源,不会跟随场景切换而销毁
    "Persistence": [
        {
            "driver": "Addressable",
            "type": "Object",
            "label": "default"
        }
    ],

    // 跟随场景生命周期而存在的资源, 配置的资源会在加载场景的时候同步加载
    "SceneEntry": [    // 场景名
        {
            "driver": "Resources", // Resources 资源
            "type": "GameObject", //资源类型
            "path": "Prefabs/UI/SceneEntry" // 资源路径 相对于项目内任意Resources文件夹
        },
        {
            "driver": "AssetBundle", // AssetBundle资源
            "path": "main.bundle" // 资源路径 相对于 StreamingAssets/AssetBundles/
        },
        {
            "driver": "Addressable", // 可寻址资源
            "type": "Sprite", // 资源类型
            "label": "scene_entry_textures" // 资源标签
        }
    ]

推荐使用流程

为简化资源管理成本,若项目体量较小,且对资源分包无细颗粒度需求,则可以直接在编辑器内,右键点击资源所在文件夹,执行Add To Addressable System菜单即可,此操作会默认对该文件夹内的资源打上default标签,resources.json文件默认配置该标签,因此资源会被自动加载。

代码中获取资源
using UnityEngine;
using UNIHper;
using UniRx;

public class SceneEntryScript : SceneScriptBase
{
    // Called once after scene is loaded
    private void Start()
    {
        // 资源路径可以是相对路径, 下面两种方式均能获取到资源
        var _avatar1 = Managements.Resource.Get<Sprite>("ArtAssets/Textures/User01/Avatar");
        var _avatar2 = Managements.Resource.Get<Sprite>("User01/Avatar");

        // 也可以直接使用资源名,但是需要保证资源名唯一性,否则获取结果具有不确定性
        var _avatar3 = Managements.Resource.Get<Sprite>("Avatar");
    }
}

路径参数解释:

  • 对于Addressables资源,完整路径为Assets/xxx/xxx

  • 对于Resources资源,完整路径为Resources/xxx/xxx

资源分组

若需要获取分组资源,则可以通过Addressable系统的标签功能进行实现。

配置player标签资源
{
    ...
    "SceneEntry": [
           {
               "driver": "Addressable",
               "type": "GameObject",
               "label": "player"
           }
    ]
}

// 获取标签组资源
var _players = Managements.Resource.GetLabelAssets<GameObject>("player");

Last updated