仿LOL项目开发第二天

                                      by草帽

昨个我们已经实现了下载功能,但是发现没有,下载的包是压缩的,没有解压开,那么Unity是识别不了的。

所以今个我们来讲讲如何实现解压文件。

还记得吗,我们在DownloadTask里面添加了一个完成下载后的一个解压委托,我们还没有实现,那么,我们就去解决他。

回到VersionManager的DownloadPackageList方法里面,在OnDownloadFinished委托里面,添加解压缩的代码。

之前讲过类的单一职责,所以不可能在VersionManager里面完成解压缩功能吧。

所以呢,我们新建一个文件管理类:FileAccessManager.cs:

using UnityEngine;
using System.Collections;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using ICSharpCode.SharpZipLib.Zip;
/// <summary>
/// 文件管理器
/// </summary>
public static class FileAccessManager
{
/// <summary>
/// 解压文件到资源文件目录
/// </summary>
/// <param name="filePath"></param>
public static void DecompressFile(string filePath)
{
DecompressToDirectory(SystemConfig.ResourceFolder, filePath);
}
/// <summary>
/// 解压文件到指定文件路径
/// </summary>
/// <param name="targetPath"></param>
/// <param name="zipFilePath"></param>
public static void DecompressToDirectory(string targetPath,string zipFilePath)
{
if (File.Exists(zipFilePath))
{
Stream compressed = File.OpenRead(zipFilePath);
compressed.DecompressToDirectory(targetPath);
}
else
{
Debug.LogError("解压文件不存在");
}
}
private static void DecompressToDirectory(this Stream source, string targetPath)
{
targetPath = Path.GetFullPath(targetPath);
using (ZipInputStream decompressor = new ZipInputStream(source))
{
ZipEntry entry; while ((entry = decompressor.GetNextEntry()) != null)
{
string name = entry.Name;
if (entry.IsDirectory && entry.Name.StartsWith("\\"))
name = entry.Name.ReplaceFirst("\\", "");
//name = ReplaceFirst(entry.Name, "\\", "");
string filePath = Path.Combine(targetPath, name);
string directoryPath = Path.GetDirectoryName(filePath); if (!string.IsNullOrEmpty(directoryPath) && !Directory.Exists(directoryPath))
Directory.CreateDirectory(directoryPath); if (entry.IsDirectory)
continue; byte[] data = new byte[2048];
using (FileStream streamWriter = File.Create(filePath))
{
int bytesRead;
while ((bytesRead = decompressor.Read(data, 0, data.Length)) > 0)
{
streamWriter.Write(data, 0, bytesRead);
}
}
}
}
}
public static string ReplaceFirst(this string source, string oldString, string newString)
{
Regex regEx = new Regex(oldString, RegexOptions.Multiline);
return regEx.Replace(source, newString == null ? "" : newString, 1);
}
}

不懂解压缩文件的童鞋可以看我另一篇博客:通用工具类解压缩文件篇 

这里我就不详细介绍了,我们继续回到VersionManager的DownloadPackageList:

Action OnDownloadFinished =()=>
{
//进行解压,以后再来
if (File.Exists(localFile))
{
//开始解压文件
FileAccessManager.DecompressFile(localFile);
}
if (File.Exists(localFile))
{
File.Delete(localFile);
}
//更新本地版本信息
LocalVersion.ResourceVersionCodeInfo = new VersionCodeInfo(kvp.Key);
//保存版本信息
SaveVersion(LocalVersion);
};

SaveVersion():更新本地版本信息xml

    /// <summary>
/// 保存版本信息到xml文件中
/// </summary>
/// <param name="version"></param>
private void SaveVersion(VersionManagerInfo version)
{
var props = typeof(VersionManagerInfo).GetProperties();
XmlDocument doc = new XmlDocument();
XmlDeclaration newChild = doc.CreateXmlDeclaration("1.0", "UTF-8", null);
doc.AppendChild(newChild);
XmlElement root = doc.CreateElement("root");
doc.AppendChild(root);
foreach (var prop in props)
{
XmlElement e = doc.CreateElement(prop.Name);
string value = prop.GetGetMethod().Invoke(version,null) as string;
e.InnerText = value;
root.AppendChild(e);
}
UnityTools.SaveText(SystemConfig.VersionPath, doc.InnerXml);
}

Ok,我们来运行一下程序,哎,发现有错误,和之前一样的错误。

也就是说获取Application.dataPath不能在其他线程获取,我们看看那些弄了线程。

找到了,也就是在DownloadMrg的CheckDownloadList的时候new 一个下载线程:

所以解决方法还是,去DownloadTask类里面,找到OnFinished方法,修改下:

    public void OnFinished()
{
if (Finished != null)
LOLGameDriver.Invoke(Finished);
//Finished();
}

然后回到DownloadFinishedWithMd5()里面,找到task.Finished()改成task.OnFinished();

再次运行程序:

可以看到原先的压缩文件已经自动解压开了(看不到的童鞋请刷新下Project的资源),因为我们已经修改了版本信息,所以再次运行看看:

可以看到不需要更新了,说明版本已经迭代了。Ok,基本上版本更新已经搞一个段落,现在只差和界面交互,所以下一节,我们专门来讲讲界面UI的框架。

仿LOL项目开发第四天链接地址

仿LOL项目开发第三天的更多相关文章

  1. 仿LOL项目开发第二天

    仿LOL项目开发第二天 by草帽 接着上节来讲,上节更新还没开始写代码逻辑,今天我们补充完整. 我们找到VersionManager脚本里面的CheckVersion方法: 首先我们想到检测版本,需要 ...

  2. 仿LOL项目开发第一天

    ---恢复内容开始--- 仿LOL项目开发第一天 by---草帽 项目源码研究群:539117825 最近看了一个类似LOL的源码,颇有心得,所以今天呢,我们就来自己开发一个类似于LOL的游戏demo ...

  3. 仿LOL项目开发第九天

    仿LOL项目开发第九天 by 草帽 OK,今天我们完全换了一种风格,抛弃了Unity3d的c#语法,我们来写写java的项目. 说到java服务器,当然有些人可能鄙视java的服务器速度太慢,但是相对 ...

  4. 仿LOL项目开发第八天

    仿LOL项目开发第八天 by 草帽 这节我们继续上节所讲的内容,上节我们初始化好了LoginWindow,当我们点击确认选择服务器按钮的时候,就发送服务器id给游戏服务器. 这里就开始涉及到客户端需要 ...

  5. 仿LOL项目开发第七天

    仿LOL项目开发第七天 by 草帽 不知不觉已经写到了第七篇这种类型的博客,但是回过头看看之前写的,发现都只能我自己能看懂. 我相信在看的童鞋云里雾里的,因为我基本上没怎么详细讲一个脚本怎么用?但是你 ...

  6. 仿LOL项目开发第六天

    仿LOL项目开发第六天 by草帽 OK,因为更新模块已经处理好了,接着开始登陆的编写.那么我们就需要状态机的管理. 所谓状态机就是在哪个状态执行那个状态的代码逻辑: 那么我们开始编写GameState ...

  7. 仿LOL项目开发第五天

    仿LOL项目开发第五天 by草帽 今天呢,我们看下能开发什么内容,首先上节我们已经讲了UI框架的搭建,上节还遗留下很多问题,比如说消息的字符是代码里面自己赋值的. 那么就比较死板,按照正常的逻辑,那些 ...

  8. 仿LOL项目开发第四天

    ---恢复内容开始--- 仿LOL项目开发第四天 by草帽 上节讲了几乎所有的更新版本的逻辑,那么这节课我们来补充界面框架的搭建的讲解. 我们知道游戏中的每个界面都有自己的一个类型:比如登陆界面,创建 ...

  9. 基于Vue的WebApp项目开发(三)

    实现根组件通用的头部和底部样式 明白由webpack搭建起来的Vue项目的执行流程,那么就可以知道实现这个需要只要在根组件和入口文件上做“手脚”即可 <!--以后项目的根组件--> < ...

随机推荐

  1. 从输入URL到显示页面的过程分析

    作为一个软件开发者,你一定会对网络应用如何工作有一个完整的层次化的认知,同样这里也包括这些应用所用到的技术:像浏览器,HTTP,HTML,网络服务器,需求处理等等. 本文将更深入的研究当你输入一个网址 ...

  2. 【前端笔记】浅谈js继承

    我们先想想我们用js最后要怎样实现面向对象的编程.事实上我们必须用上原型链这种东西. 我们的父类superType有属性和方法,并且一些能被子类subType继承,一些能被覆盖,但是丝毫不会影响到父类 ...

  3. html学习-css

    1.css初识 css 中文解释:层叠样式表,把html比作骨骼的话,css就是衣服,他的外在都能通过css来修饰,js则是肌肉,能使html动起来.产生用户交互... 1.1css样式表类型 css ...

  4. numpy中min函数

    numpy提供的数组功能比较常用,NumPy中维数被称为轴,轴数称为秩. import numpy as np 比如a = np.array([[1, 5, 3], [4, 2, 6]]) a.min ...

  5. 《构建高性能 Web站点》笔记

    书名:构建高性能Web站点 出版社: 电子工业出版社 ISBN:9787121170935 一  绪论 等待的时间: (1) 数据在网络上的传输时间 (2) 站点服务器处理请求并生成回应数据的时间 ( ...

  6. 用Redis Desktop Manager连接Redis(CentOS)

    Redis Desktop Manager是Redis图形化管理工具,方便管理人员更方便直观地管理Redis数据. 然而在使用Redis Desktop Manager之前,有几个要素需要注意: 一. ...

  7. CentOS 7中以runfile形式安装CUDA 9.0

    GPU: NVIDIA Tesla K40C Enter the 'root' mode: $ su - 1. Pre-installation 1.1 Verify you have a CUDA- ...

  8. 「学习笔记」wqs二分/dp凸优化

    [学习笔记]wqs二分/DP凸优化 从一个经典问题谈起: 有一个长度为 \(n\) 的序列 \(a\),要求找出恰好 \(k\) 个不相交的连续子序列,使得这 \(k\) 个序列的和最大 \(1 \l ...

  9. Java并发(七):双重检验锁定DCL

    双重检查锁定(Double Check Lock,DCL) 1.懒汉式单例模式,无法保证线程安全: public class Singleton { private static Singleton ...

  10. 【洛谷】P1052 过河【DP+路径压缩】

    P1052 过河 题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙 ...