Unity5.X AssetBundle检测资源更新

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Xml;


public class AssetCheckerManager : MonoBehaviour {


    #region 变量声明


    #region 单例


    private static AssetCheckerManager instance;
    public static AssetCheckerManager Instance
    {
        get
        {
            if (instance == null)
            {
                instance = new GameObject("AssetCheckerManager").AddComponent();
            }
            return instance;
        }
    }


    #endregion


    ///
    /// 是否进行资源检测
    ///

    public bool checkAssetBundle = false;
    ///
    /// 版本号文件名称
    ///

    private string versionNumber;
    ///
    /// 资源MD5文件名称
    ///

    private string versionMD5;
    ///
    /// 资源服上的MD5文件
    ///

    private string versionMD5_Server;
    ///
    /// 本地版本号
    ///

    public string localVersionNumber;
    ///
    /// 本地资源下载地址
    ///

    private string localPath;
    ///
    /// 资源服下载地址
    ///

    private string serverPath;
    ///
    /// 本地MD5XML
    ///

    private Dictionary> localVersionMD5Dir;
    ///
    /// 服务器MD5XML
    ///

    private Dictionary> serverVersionMD5Dir;
    ///
    /// 需要下载的资源名称
    ///

    private List needDownLoadFiles;
    ///
    /// 需要下载的资源大小
    ///

    private List needDowbLoadFilesSize;
    ///
    /// 资源下载路径
    ///

    private AssetLoader loder;
    ///
    /// 下载完成后的委托
    ///

    ///
    public delegate void HandleFinishDownload(WWW www);


    #endregion


    #region 提供外部方法


    ///
    /// 检测版本
    ///

    public void StartCheck()
    {
        CompareVersionNumber();
    }


    ///
    /// 下载资源
    ///

    public void DownLoad()
    {
        DownLoadAssetBundle();
    }


    #endregion




    #region 内部实现


    ///
    /// 初始化
    ///

    void Awake()
    {
        instance = this;
        Initialize();
    }


    ///
    /// 实例化
    ///

    void Initialize()
    {
        versionNumber = "VersionNumber.txt";
        versionMD5 = "VersionMD5.xml";
        versionMD5_Server = "VersionMD5_Server.xml";


        localPath = Application.persistentDataPath + "/";
        serverPath = "file:///C:/Users/songhy/Desktop/test/";


        localVersionMD5Dir = new Dictionary>();
        serverVersionMD5Dir = new Dictionary>();


        needDownLoadFiles = new List();
        needDowbLoadFilesSize = new List();


        loder = new AssetLoader();
    }


    ///
    /// 版本号对比
    ///

    void CompareVersionNumber()
    {
        if (checkAssetBundle)
        {
            //首先检查版本是否有更新 有更新就跳转到下载界面
            StartCoroutine(DownLoad(loder.GetDownLoadURL(versionNumber), delegate (WWW local)
            {
                localVersionNumber = local.text;


                StartCoroutine(DownLoad(serverPath + versionNumber, delegate (WWW server)
                {
                    if (localVersionNumber == server.text)
                    {
                        //版本相同 检测资源是否需要更新
                        CheckAssetBundle();
                    }
                    else
                    {
                        //版本不同 更新客户端
                        Debug.LogError("版本不同 更新客户端");
                        Application.OpenURL("http://www.baidu.com");
                    }
                }));
            }));
        }
        else
        {
            Debug.logger.Log(LogType.Log, "游戏运行没有选择进行资源更新");
        }
    }


    ///
    /// 检测资源是否需要更新
    ///

    private void CheckAssetBundle()
    {
        StartCoroutine(DownLoad(serverPath + versionMD5, delegate (WWW server)
        {
            //将资源服上的MD5文件下载到本地 并重新命名为versionMD5_Server
            DownLoadToLocal(versionMD5_Server, server.bytes);


            GetLocalVersionMD5(versionMD5, localVersionMD5Dir);
            GetLocalVersionMD5(versionMD5_Server, serverVersionMD5Dir);


            //对比MD5文件
            CompareVersion();


        }));
    }


    ///
    /// 下载更新资源
    ///

    private void DownLoadAssetBundle()
    {
        if (needDownLoadFiles.Count == 0)
        {
            ReplaceVersionMD5();


            Debug.LogError("进入游戏!");
            return;
        }


        string file = needDownLoadFiles[0];
        needDownLoadFiles.RemoveAt(0);


        StartCoroutine(DownLoad(serverPath + file, delegate (WWW www)
        {
            //替换本地资源
            DownLoadToLocal(file, www.bytes);
            DownLoadAssetBundle();
        }));
    }


    ///
    /// 更换MD5文件
    ///

    private void ReplaceVersionMD5()
    {
        if (File.Exists(localPath + versionMD5))
            File.Delete(localPath + versionMD5);


        if (File.Exists(localPath + versionMD5_Server))
            File.Move(localPath + versionMD5_Server, localPath + versionMD5);
    }




    ///
    /// 对比MD5Dir
    ///

    private void CompareVersion()
    {
        foreach (var item in serverVersionMD5Dir)
        {
            if (localVersionMD5Dir.ContainsKey(item.Key))
            {
                //对比这个文件的MD5
                List localMD5List;
                localVersionMD5Dir.TryGetValue(item.Key, out localMD5List);


                if (!localMD5List[0].Equals(item.Value[0]))
                {
                    //需要下载这个文件
                    needDownLoadFiles.Add(item.Key);
                    needDowbLoadFilesSize.Add(localMD5List[1]);
                }
            }
            else
            {
                //需要下载这个文件
                needDownLoadFiles.Add(item.Key);
                needDowbLoadFilesSize.Add(item.Value[1]);
            }
        }


        if (needDownLoadFiles.Count > 0)
            Debug.LogError("需要更新资源  更新资源个数为____" + needDownLoadFiles.Count);
        else
            Debug.LogError("不需要更新资源  直接进入游戏!");


    }




    ///
    /// 获取MD5文件内容
    ///

    ///
    ///
    public void GetLocalVersionMD5(string versionName, Dictionary> MD5Dir)
    {


        MD5Dir.Clear();
        string content = "";
        string path = loder.GetStreamPath(versionName);


        StreamReader sr = new StreamReader(path, Encoding.Default);
        content = sr.ReadToEnd();
        sr.Close();
        sr.Dispose();






        XmlDocument XmlDoc = new XmlDocument();
        //XmlDoc.Load(fileName);
        XmlDoc.LoadXml(content);


        XmlElement XmlRoot = XmlDoc.DocumentElement;


        foreach (XmlNode node in XmlRoot.ChildNodes)
        {
            if ((node is XmlElement) == false)
                continue;


            List tempList = new List();
            string file = (node as XmlElement).GetAttribute("FileName");
            string md5 = (node as XmlElement).GetAttribute("MD5");
            string size = (node as XmlElement).GetAttribute("Size");
            tempList.Add(md5);
            tempList.Add(size);


            if (MD5Dir.ContainsKey(file) == false)
            {
                MD5Dir.Add(file, tempList);
            }
        }
        XmlRoot = null;
        XmlDoc = null;
    }






    ///
    /// 下载WWW
    ///

    ///
    ///
    ///
    private IEnumerator DownLoad(string url, HandleFinishDownload finishFun)
    {
        WWW www = new WWW(url);
        yield return www;
        if (www.error != null) Debug.LogError(www.error + "_______________________________/" + url);
        if (finishFun != null)
            finishFun(www);
        www.Dispose();
    }


    ///
    /// 下载文件到本地
    ///

    ///
    ///
    private void DownLoadToLocal(string fileName, byte[] data)
    {
        string filePath = Application.persistentDataPath + "/" + fileName;
        filePath = filePath.Replace('\\', '/');
        string[] temp = filePath.Split('/');


        string path = "";


        for (int i = 0; i < temp.Length - 1; i++)
        {
            path += temp[i] + "/";
        }


        //如果没有这个文件夹 就创建一个
        if (!Directory.Exists(path))
        {
            Directory.CreateDirectory(path);
        }


        FileStream stream = new FileStream(filePath, FileMode.Create);
        stream.Write(data, 0, data.Length);
        stream.Flush();
        stream.Close();
    }




    #endregion
}

你可能感兴趣的:(Unity5.X AssetBundle检测资源更新)