﻿## Res Kit 简介
Res Kit，是资源管理&快速开发解决方案

**特性如下:**
* 可以使用一个 API 从  dataPath、Resources、StreammingAssetPath、PersistentDataPath、网络等地方加载资源。
* 基于引用计数，简化资源加载和卸载。
* 拥抱游戏开发流程中的不同阶段
    * 开发阶段不用打 AB 直接从 dataPath 加载。
    * 测试阶段支持只需打一次 AB 即可。
* 可选择生成资源名常量代码，减少拼写错误。
* 异步加载队列支持
* 对于 AssetBundle 资源，可以只通过资源名而不是 AssetBundle 名 + 资源名 加载资源，简化 API 使用。


## Res Kit 快速入门
我们知道，在一般情况下，有两种方式可以让我们实现动态加载资源：
* Resources
* AssetBundle

在 Res Kit 中，推荐使用 AssetBundle 的方式进行加载，因为 Res Kit 所封装的 AssetBundle 方式，比 Resources 的方式更好用。

除了 Res Kit 中的 AsseBundle 方式更易用外，AssetBundle 本身相比 Resources 有更多的优点，比如更小的包体，支持热更等。

废话不多说，我们看下 Res Kit 的基本使用。

Res Kit 在开发阶段，分为两步。
* 标记资源
* 写代码

在开始之前，我们要确保，当前的 Res Kit 环境为模拟模式。

按下快捷键 ctrl + e 或者 ctrl + shift + r ，我们可以看到如下面板:

![image.png](https://file.liangxiegame.com/d6d1ac25-4c60-4b42-81ec-51b1628b640a.png)

确保模拟模式勾选之后，我们就可以进入使用流程了。

### 1. 资源标记

在 Asset 目录下，只需对需要标记的文件或文件夹右键->@ResKit- AssetBundle Mark，如下所示：

![image.png](https://file.liangxiegame.com/2d793421-94cb-457f-80da-ee976f700f02.png)

标记完了，

标记成功后，我们可以看到如下结果：

1. 该资源标记的选项为勾选状态

![image.png](https://file.liangxiegame.com/1ced7efd-a328-4c5e-a76a-4a85020acdd2.png)

2. 该资源的 AssetLabel 中的名字如下
   ![image.png](https://file.liangxiegame.com/a7e20396-e553-4ead-8291-e4395fe53b30.png)

这样就标记成功了。

这里注意，一次标记就是一个 AssetBundle，如果想要让 AssetBundle 包含多个资源，可以将多个资源放到一个文件夹中，然后标记文件夹。


### 2.资源加载
接下来我们直接写资源加载的代码即可，代码如下，具体的代码含义，看注释即可。。

```csharp
using UnityEngine;

namespace QFramework.Example
{
    public class ResKitExample : MonoBehaviour
    {
        // 每个脚本都需要
        private ResLoader mResLoader = ResLoader.Allocate();

        private void Start()
        {
            // 项目启动只调用一次即可
            ResKit.Init();
            
            // 通过资源名 + 类型搜索并加载资源（更方便）
            var prefab = mResLoader.LoadSync<GameObject>("AssetObj");
            var gameObj = Instantiate(prefab);
            gameObj.name = "这是使用通过 AssetName 加载的对象";

            // 通过 AssetBundleName 和 资源名搜索并加载资源（更精确）
            prefab = mResLoader.LoadSync<GameObject>("assetobj_prefab", "AssetObj");
            gameObj = Instantiate(prefab);
            gameObj.name = "这是使用通过 AssetName  和 AssetBundle 加载的对象";
        }

        private void OnDestroy()
        {
            // 释放所有本脚本加载过的资源
            // 释放只是释放资源的引用
            // 当资源的引用数量为 0 时，会进行真正的资源卸载操作
            mResLoader.Recycle2Cache();
            mResLoader = null;
        }
    }
}
```

将此脚本挂到任意 GameObject 上，运行后，结果如下:


![image.png](https://file.liangxiegame.com/04cd1727-b7ad-436d-988c-80b70c0fc106.png)

资源加载成功。

本文由 QFramework 教程年会员赞助，地址：[https://www.gamepixedu.com/goods/show/55](https://www.gamepixedu.com/goods/show/55)

* QFramework 主页：[qframework.cn](https://qframework.cn)
* QFramework 交流群: 541745166
* QFramework Github 地址: <https://github.com/liangxiegame/qframework>
* QFramework Gitee 地址：<https://gitee.com/liangxiegame/QFramework>