/// <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("创建版本文件成功"); }
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完毕"); }