-
Notifications
You must be signed in to change notification settings - Fork 545
资源管理
框架把资源统一交给资源管理器管理
资源管理器打开方式: 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,在打包设置编辑器中点击打包,在打包结束后,可以将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
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>();
}
}
}