仿LOL项目开发第三天

仿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的框架。

时间: 2024-08-11 23:39:53

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

仿LOL项目开发第四天

---恢复内容开始--- 仿LOL项目开发第四天 by草帽 上节讲了几乎所有的更新版本的逻辑,那么这节课我们来补充界面框架的搭建的讲解. 我们知道游戏中的每个界面都有自己的一个类型:比如登陆界面,创建角色界面. 既然有这么多的界面,所以呢,我们创建一个单例的UI管理器:WindowManager.cs,然后里面创建一个字典来存所有类型的界面: using UnityEngine; using System.Collections.Generic; using Game; using Game.C

仿LOL项目开发第二天

仿LOL项目开发第二天 by草帽 接着上节来讲,上节更新还没开始写代码逻辑,今天我们补充完整. 我们找到VersionManager脚本里面的CheckVersion方法: 首先我们想到检测版本,需要从服务器下载信息,那么肯定要提前检测下网络是否良好,并比较版本信息. 所以,我们写个BeforeCheck方法: /// <summary> /// 检测网络状况并对照版本信息是否一致 /// </summary> /// <param name="AsynResult

仿LOL项目开发第六天

仿LOL项目开发第六天 by草帽 OK,因为更新模块已经处理好了,接着开始登陆的编写.那么我们就需要状态机的管理. 所谓状态机就是在哪个状态执行那个状态的代码逻辑: 那么我们开始编写GameStateManager来管理: 我们先在DefineCommon里面定义游戏状态类型: /// <summary> /// 游戏状态 /// </summary> public enum GameStateType { GS_Continue,//中间状态,也就是说介于两个状态转换的中间状态

Android项目开发第三周

(一)学习内容概括 1.Android的应用界面编程 2.塔防游戏的学习 (二)学习内容 1.布局管理器:线性布局.表格布局.帧布局.相对布局.网格布局.绝对布局. 2.textview及其子类 3.imageview及其子类 4.adapterview及其子类 5.progressbar及其子类 6.viewanimator及其类 7.塔防游戏的学习 游戏的类框架 公共类 游戏的控制器TafangGameACtivity类 TafangGameACtivity类的框架搭建 Handler消息处

weex 项目开发(三) weex + weex-ui

github地址:weex-ui https://github.com/alibaba/weex-ui 官网: https://alibaba.github.io/weex-ui/#/cn/ 汇集使用 (推荐) import { WxcComponent1, WxcComponent2 } from "weex-ui" 为了不打包所有的组件,你需要使用 babel-plugin-component 来只引入需要的组件打包. npm i babel-plugin-component -D

【轻松一刻】实战项目开发(三) 分享文本内容至微信

首先需要在微信开放平台创建应用 并等待审核通过. 需要注意包名,签名不要写错了.创建的应用可以是暂时没有上线了, 应用名称中不能含有微信二字,否则会被驳回,一般一至两天就能通过. 注意 严格按照 开发指南或者参考SDK Sample Demo步骤来,不能少. 使用android tools 导出带签名的apk,不要使用run as. 如果配置信息中打开了代码混淆,为了保证sdk的正常使用, 需要在proguard.cfg加上下面两行配置: -keep class com.tencent.mm.s

(我是初学者)第一次项目开发(三 后期调试)

项目写完了,进行最后的测试,在此期间遇到的了各种问题,有些看似一样的错误,可原因却个不相同.大致分下,有一下几种: 1.格式转换错误 由于很多数据是从文本框中获取的,是String类型,但我们的实体类属性设置的是int或date等,那么就需要转换,但是像一串字母或汉字是不能转为int类型,同样格式不对的一串数字也不能转为date类型,这就要我们去加数据判断,有时我们疏忽了,就会造成这样的错误 2.空值异常 这个情况,多是在持久层或业务层封装的时候,没有把相关的属性封装到对象中,当调用bean中的

宣传页项目开发(三)

网页交互效果的实现 滚动条高度的获取以及设置:document.body.scrollTop || document.documentElement.scrollTop .split()  把字符串分割成数组 .join()  把数组转为字符串 .replace( /\s+/g, " ")  正则全局替换,把多个空格符替换为一个空格符 综合效果 index.html <!DOCTYPE html> <html lang="en"> <h

团队项目开发第三天

1.昨天干了什么? 做首页的导航栏,出现一些问题. 2.今天准备干什么? 能把首页做完,包括logo,导航栏什么的,查一些下个页面所需的东西. 3.遇到什么困难? ...不知道该怎么说了,今天几乎没什么进度,做着做着发现环境有问题,重新安装,下载Sdk Mananger!