예제 #1
0
    /// <summary>
    /// 生成版本文件
    /// </summary>
    private void OnCreateVersionFileCallBack()
    {
        string path = Application.dataPath + "/../AssetBundles/" + dal.GetVersion() + "/" + arrBuildTarget[buildTargetIndex];

        if (!Directory.Exists(path))
        {
            Directory.CreateDirectory(path);
        }

        string strVersionFilePath = path + "/VersionFile.txt"; //版本文件路径

        //如果版本文件存在 则删除
        IOUtil.DeleteFile(strVersionFilePath);

        StringBuilder sbContent = new StringBuilder();

        DirectoryInfo directory = new DirectoryInfo(path);

        //拿到文件夹下所有文件
        FileInfo[] arrFiles = directory.GetFiles("*", SearchOption.AllDirectories);

        sbContent.AppendLine(dal.GetVersion());
        for (int i = 0; i < arrFiles.Length; i++)
        {
            FileInfo file = arrFiles[i];

            if (file.Extension == ".manifest")
            {
                continue;
            }
            string fullName = file.FullName; //全名 包含路径扩展名

            //相对路径
            string name = fullName.Substring(fullName.IndexOf(arrBuildTarget[buildTargetIndex]) + arrBuildTarget[buildTargetIndex].Length + 1);

            string md5 = EncryptUtil.GetFileMD5(fullName); //文件的MD5
            if (md5 == null)
            {
                continue;
            }

            string size = file.Length.ToString(); //文件大小

            bool isFirstData = false;             //是否初始数据
            bool isEncrypt   = false;
            bool isBreak     = false;

            for (int j = 0; j < m_List.Count; j++)
            {
                foreach (string xmlPath in m_List[j].PathList)
                {
                    string tempPath = xmlPath;
                    if (xmlPath.IndexOf(".") != -1)
                    {
                        tempPath = xmlPath.Substring(0, xmlPath.IndexOf("."));
                    }

                    name = name.Replace("\\", "/");
                    if (name.IndexOf(tempPath, StringComparison.CurrentCultureIgnoreCase) != -1)
                    {
                        isFirstData = m_List[j].IsFirstData;
                        isEncrypt   = m_List[j].IsEncrypt;
                        isBreak     = true;
                        break;
                    }
                }
                if (isBreak)
                {
                    break;
                }
            }

            string strLine = string.Format("{0}|{1}|{2}|{3}|{4}", name, md5, size, isFirstData ? 1 : 0, isEncrypt ? 1 : 0);
            sbContent.AppendLine(strLine);
        }

        IOUtil.CreateTextFile(strVersionFilePath, sbContent.ToString());

        MMO_MemoryStream ms  = new MMO_MemoryStream();
        string           str = sbContent.ToString().Trim();

        string[] arr = str.Split('\n');
        int      len = arr.Length;

        ms.WriteInt(len);
        for (int i = 0; i < len; i++)
        {
            if (i == 0)
            {
                ms.WriteUTF8String(arr[i]);
            }
            else
            {
                string[] arrInner = arr[i].Split('|');
                ms.WriteUTF8String(arrInner[0]);
                ms.WriteUTF8String(arrInner[1]);
                ms.WriteULong(ulong.Parse(arrInner[2]));
                ms.WriteByte(byte.Parse(arrInner[3]));
                ms.WriteByte(byte.Parse(arrInner[4]));
            }
        }

        string filePath = path + "/VersionFile.bytes"; //版本文件路径

        byte[] buffer = ms.ToArray();
        buffer = ZlibHelper.CompressBytes(buffer);
        FileStream fs = new FileStream(filePath, FileMode.Create);

        fs.Write(buffer, 0, buffer.Length);
        fs.Close();
        fs.Dispose();

        Debug.Log("创建版本文件成功");
    }
예제 #2
0
    public static void AssetBundleCopyToStreamingAsstes()
    {
        string toPath = Application.streamingAssetsPath + "/AssetBundles/";

        if (Directory.Exists(toPath))
        {
            Directory.Delete(toPath, true);
        }
        Directory.CreateDirectory(toPath);

        IOUtil.CopyDirectory(Application.persistentDataPath, toPath);

        //重新生成版本文件
        //1.先读取persistentDataPath里边的版本文件 这个版本文件里 存放了所有的资源包信息

        byte[] buffer  = IOUtil.GetFileBuffer(Application.persistentDataPath + "/VersionFile.bytes");
        string version = "";
        Dictionary <string, AssetBundleInfoEntity> dic    = ResourceManager.GetAssetBundleVersionList(buffer, ref version);
        Dictionary <string, AssetBundleInfoEntity> newDic = new Dictionary <string, AssetBundleInfoEntity>();

        DirectoryInfo directory = new DirectoryInfo(toPath);

        //拿到文件夹下所有文件
        FileInfo[] arrFiles = directory.GetFiles("*", SearchOption.AllDirectories);

        for (int i = 0; i < arrFiles.Length; i++)
        {
            FileInfo file     = arrFiles[i];
            string   fullName = file.FullName.Replace("\\", "/"); //全名 包含路径扩展名
            string   name     = fullName.Replace(toPath, "");
            if (name.Equals("AssetInfo.json", StringComparison.CurrentCultureIgnoreCase) ||
                name.Equals("Windows", StringComparison.CurrentCultureIgnoreCase) ||
                name.Equals("Windows.manifest", StringComparison.CurrentCultureIgnoreCase)

                || name.Equals("Android", StringComparison.CurrentCultureIgnoreCase) ||
                name.Equals("Android.manifest", StringComparison.CurrentCultureIgnoreCase)

                || name.Equals("iOS", StringComparison.CurrentCultureIgnoreCase) ||
                name.Equals("iOS.manifest", StringComparison.CurrentCultureIgnoreCase)
                )
            {
                File.Delete(file.FullName);
                continue;
            }

            AssetBundleInfoEntity entity = null;
            dic.TryGetValue(name, out entity);


            if (entity != null)
            {
                newDic[name] = entity;
            }
        }

        StringBuilder sbContent = new StringBuilder();

        sbContent.AppendLine(version);

        foreach (var item in newDic)
        {
            AssetBundleInfoEntity entity = item.Value;
            string strLine = string.Format("{0}|{1}|{2}|{3}|{4}", entity.AssetBundleName, entity.MD5, entity.Size, entity.IsFirstData ? 1 : 0, entity.IsEncrypt ? 1 : 0);
            sbContent.AppendLine(strLine);
        }

        IOUtil.CreateTextFile(toPath + "VersionFile.txt", sbContent.ToString());

        //=======================
        MMO_MemoryStream ms  = new MMO_MemoryStream();
        string           str = sbContent.ToString().Trim();

        string[] arr = str.Split('\n');
        int      len = arr.Length;

        ms.WriteInt(len);
        for (int i = 0; i < len; i++)
        {
            if (i == 0)
            {
                ms.WriteUTF8String(arr[i]);
            }
            else
            {
                string[] arrInner = arr[i].Split('|');
                ms.WriteUTF8String(arrInner[0]);
                ms.WriteUTF8String(arrInner[1]);
                ms.WriteULong(ulong.Parse(arrInner[2]));
                ms.WriteByte(byte.Parse(arrInner[3]));
                ms.WriteByte(byte.Parse(arrInner[4]));
            }
        }

        string filePath = toPath + "/VersionFile.bytes"; //版本文件路径

        buffer = ms.ToArray();
        buffer = ZlibHelper.CompressBytes(buffer);
        FileStream fs = new FileStream(filePath, FileMode.Create);

        fs.Write(buffer, 0, buffer.Length);
        fs.Close();

        AssetDatabase.Refresh();
        Debug.Log("初始资源拷贝到StreamingAsstes完毕");
    }