Download下载
API
逻辑流程
首先是加载
然后是组件初始化Awake的相关逻辑
主要是获取了 GameFramework的下载管理器,同时添加了4个事件。然后是设置了缓冲区的大小,这个主要是用来断点续传,最后一个是下载超时设置。
抛出了四个创建的事件。
这四个参数类都差不多,主要是定义了属性,和实现了创造事件的方法。
然后是 Start的逻辑
主要是设置了下载辅助器根的位置,然后增加了下载代理辅助器
然后继续观察代理辅助器 基类
代理辅助器主要定义了一些事件,这些事件是在GameFrameWork里面,里面还定义了几个下载代理辅助器下载指定地址的数据方法和充值代理下载器的方法。
最后看下GameFramework里面的下载管理器
里面主要是有一个任务池
可以看到TaskPool里面的Update方法负责任务池轮询任务的处理
对于等待的任务会看到他是通过一个链表存储,会调用agent.start()方法,这里的agent是下载的agent,GameFrameWork下面的DownloadManager.DownloadAgent
这个m_Helper就是DownloadComponent里面的AddDownloadAgentHelper传递过来的
这个就和我们使用的web代理联系起来了
现在的代理用的是UnityWebRequestDownloadAgentHelper
里面主要是绑定了四个代理方法,实现了download的具体逻辑
和重置下载代理辅助器的方法。然后配合了Update()函数里面来判定成功和失败的逻辑处理
大致流程就是这样。
使用
//第一个参数和路径和文件名,记得要加上格式,不然还要另外给他指定格式,第二个参数是下载地址
GameEntry.Download.AddDownload("E:/testDownload"+"/inuyasha.png","http://192.168.144.112/Inuyasha.png");
GameEntry.Download.AddDownload("E:/testDownload"+"/半岛铁盒.mp4","http://192.168.144.112/jay.mp4");
GameEntry.Download.AddDownload("E:/testDownload"+"/离开地球表面.flac","http://192.168.144.112/earth.flac");
GameEntry.Download.AddDownload("E:/testDownload"+"/GameFrameworkSetting.dat","http://192.168.144.112/GameFrameworkSetting.dat");
第三个参数是优先级,加上了之后,数字越大,请求越先请求
GameEntry.Download.AddDownload("E:/testDownload"+"/inuyasha.png","http://192.168.144.112/Inuyasha.png",1);
GameEntry.Download.AddDownload("E:/testDownload"+"/半岛铁盒.mp4","http://192.168.144.112/jay.mp4",4);
GameEntry.Download.AddDownload("E:/testDownload"+"/离开地球表面.flac","http://192.168.144.112/earth.flac",3);
GameEntry.Download.AddDownload("E:/testDownload"+"/GameFrameworkSetting.dat","http://192.168.144.112/GameFrameworkSetting.dat",2);
2022年5月20号更新
演示在界面上下载文件解析使用
这里使用下载图片来说明
主要逻辑
public void DownLoadFunction()
{
//获取下载地址,这里使用了一个textfield来输入,可以下载最新的地址
string url = VerifyModelSingleton.Instance.downloadUrl;
//这个是用最后的后缀名来作为文件名
downloadPrefixName = url.Split('/').Last();
Debug.Log("prefix=========="+downloadPrefixName);
//下载接口 地址的用persis这个 他是沙盒路径
GameEntry.Download.AddDownload(Application.persistentDataPath+"/"+downloadPrefixName,url);
Debug.Log("DownLoadFunction------------");
}
}
//这个是下载成功回调
private void OnDownloadSuccess(object sender,GameFrameworkEventArgs eventArgs)
{
UnityGameFramework.Runtime.DownloadSuccessEventArgs e = (UnityGameFramework.Runtime.DownloadSuccessEventArgs)eventArgs;
readDownLoadFile(Application.persistentDataPath+"/"+downloadPrefixName,downloadImage);
Debug.Log("download Success responseData=========="+e.UserData);
//这里是读取二进制文件流 然后转成sprite 加到我的image上
public void readDownLoadFile(string path,Image image){
//创建文件读取流
FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read);
fileStream.Seek(0, SeekOrigin.Begin);
//创建文件长度缓冲区
byte[] bytes = new byte[fileStream.Length];
//读取文件
fileStream.Read(bytes, 0, (int)fileStream.Length);
//释放文件读取流
fileStream.Close();
fileStream.Dispose();
fileStream = null;
//创建Texture
int width=800;
int height=640;
Texture2D texture = new Texture2D(width, height);
texture.LoadImage(bytes);
//创建Sprite
Sprite sprite1 = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), new Vector2(0.5f, 0.5f));
image.sprite = sprite1;
Debug.Log("加载下载好的图片");
}
为什么要文件读取?
因为他不属于GF的文件系统,所以采用系统文件io读取。
如果不是图片怎么办?
这里拿图片举例子是比较直观,正常只要对应的解析读取,可以是任何unity支持的格式。
加载完了就能看到图片了
欢迎大家交流,有不妥之处,还请指正,谢谢。
ps:欢迎大家进q群交流游戏开发的问题(632313288)