Skip to content

资源管理

高凯 edited this page Mar 6, 2018 · 3 revisions

资源管理

框架把资源统一交给资源管理器管理
资源管理器打开方式: Window -> 打包设置管理器

点击 "自动添加 Resources 目录下的资源并保存" 会自动把 Resources 目录下的资源生成一个 ResourcesManifest 文件

同时会生成一个Version文件保存在Resources目录,这个文件是用来热更新判断版本用的。

Tip: 每当有新文件添加到Resources中时,记得重新点击一下这个按钮

加载资源

所有的资源从ResourceManager这个类中加载
加载资源时只需要名字,不需要传路径
所以这要求项目中所有文件的名字不要有重复

static string ReadTextFile(string textName) 读取一个文本文件并返回它的内容

static object Load(string name) 加载一个资源

static T Load<T>(string name) where T: UnityEngine.Object 加载一个T类型的资源

static void LoadAsync(string name,LoadCallBack callBack) 异步加载一个资源

static void UnLoad(string name) 卸载一个资源(只在Bundle方式起作用)

示例

void Update () 
{
  if(Input.GetKey(KeyCode.A))
    {
        GameObject cube= (GameObject)ResourceManager.Load("Cube");

        Instantiate(cube);
  }
}

Bundle加载

要使用Bundle加载,首先要把资源打包成Bundle,在打包设置编辑器中点击打包,在打包结束后,可以将Resources下的资源文件移除(建议改名Resources文件夹),以避免打包重复资源。
然后在Application中将UseAssetsBundle勾选

在更新资源之后,记得重新打包AssetsBundle,如果觉得打整个包时间过长,则可以单独打包一个资源

建议在开发期间使用Resources模式,在发布时使用Bundle模式

可以通过设置合理的依赖包,来避免Bundle资源重复。
设置方法,在依赖包选项卡中,点击添加一个依赖包,修改依赖包的名字和添加依赖包的资源。
设置好依赖包之后,新添加的资源会自动检测依赖关系。
最大只支持32个依赖包。

热更新

热更新需要Bundle打包方式
使用热更新管理器(HotUpdateManager)进行热更新

首先需要在打包设置编辑器点击热更新初始化按钮,建立热更新配置
在配置编辑器中选择HotUpdateConfig,填写热更新文件下载地址(DownLoadPath),保存。

把StreamingAssets目录下的所有文件上传到热更新下载目录,目录格式为DownLoadPath\平台\版本号

热更新规则: 首先下载Version文件,比较版本号,(在打包设置管理器里可以配置版本号)
如果服务器上的大版本号比较大,则直接提示更新整包
如果大版本号一致,服务器上小版本号比较大,则开始下载ResourcesManifest文件,比较文件差异,并开始下载差异文件。
如果均一致,则直接进入游戏

例:
假如 DownLoadPath = http://127.0.0.1
项目版本号为1.0.1 (与ProjectSetting一致)
平台为Android
则把热更新文件上传到 http://127.0.0.1/Android/1.0.1

平台有 Win / Android / IOS

API

HotUpdateManager static void StartHotUpdate(HotUpdateCallBack CallBack) 启动热更新

示例

public class HotUpdateStatus : IApplicationStatus
{
    public override void OnEnterStatus()
    {
        HotUpdateManager.StartHotUpdate(HotUpdate);
    }
    private void HotUpdate(HotUpdateStatusInfo info)
    {
        Debug.Log("HotUpdate status " + info.m_status + " progress " + info.m_loadState.progress);

        if (info.isFailed)
        {
            Debug.LogError("HotUpdate isFailed==>" + info.m_status);
            return;
        }

        if(info.m_status == HotUpdateStatusEnum.UpdateSuccess)
        {
            ApplicationStatusManager.EnterStatus<LoginStatus>();
        }
    }
}
Clone this wiki locally