using System.Collections; using System.Collections.Generic; using UnityEngine; using System.IO; using System.Linq; using System.Net; using System.Threading; using System.Xml; using UnityEditor; using UnityEngine.Networking; using System.Text; using System; using System.Media; namespace GeneralTools { public class ResourcesDwonload : EditorWindow { private static ResourcesDwonload window; private static string downloadRootUrl; private static string downloadGetUrl; private static string webVideoUrl; private static string webAudioUrl; private static string dataPath; private List xmlList; private List titleList; private int nowIndex = 0; private string tempSaveDir; private string saveFilePath; private DateTime downloadBeginTime; private bool httpGetFinished = false; DownloadXML nowChooseXml; bool autoopen = false; bool autoimport = false; string importdir = ""; string folderMode = ""; bool allowDownload = true; Vector2 infopos = Vector2.zero; Vector2 btnpos = Vector2.zero; bool isShowBar = false; float downPragrass = 0; Thread downLoadThread = null; Stream st; Stream so; [MenuItem("GeneralTools/资源下载/外网环境", false, 1)] static void OpenWindow() { downloadRootUrl = "http://UnityResources.fyzdev.com"; downloadGetUrl = "http://UnityResources.fyzdev.com/download.php"; webVideoUrl = "http://UnityResources.fyzdev.com/video.php?url="; webAudioUrl = "http://UnityResources.fyzdev.com/audio.php?url="; //获取窗口并打开 window = GetWindow("下载页Beta"); window.Show();//显示窗口 } [MenuItem("GeneralTools/资源下载/风语筑局域网", false, 2)] static void OpenWindowLocal() { downloadRootUrl = "http://192.168.21.136:1212"; downloadGetUrl = "http://192.168.21.136:1212/download.php"; webVideoUrl = "http://192.168.21.136:1212/video.php?url="; webAudioUrl = "http://192.168.21.136:1212/audio.php?url="; //获取窗口并打开 window = GetWindow("下载页Beta"); window.Show();//显示窗口 } private void Awake() { dataPath = Application.dataPath + "/"; httpGetFinished = false; string xmlStr = HttpGet(downloadGetUrl, ""); xmlList = HandleXML(xmlStr); titleList = xmlList.Select(m => m.rootName).ToList(); ChangeIndex(0); httpGetFinished = true; } void ChangeIndex(int index) { nowIndex = index; nowChooseXml = xmlList[nowIndex]; autoopen = nowChooseXml.autoOpen; autoimport = nowChooseXml.autoImport; importdir = nowChooseXml.importPath; folderMode = nowChooseXml.folderMode; allowDownload = nowChooseXml.allowDownload; } private void OnGUI() { if (!httpGetFinished) return; ///自动生成 /// ///生成最顶端按钮 /// btnpos = EditorGUILayout.BeginScrollView(btnpos, GUILayout.Height(40)); EditorGUILayout.BeginHorizontal(); for (int i = 0; i < titleList.Count; i++) { int index = i; if (GUILayout.Button(titleList[index], GUILayout.Width(100))) { ChangeIndex(index); } } EditorGUILayout.EndHorizontal(); EditorGUILayout.EndScrollView(); //下方的东西会刷新 //临时路径 tempSaveDir = GetTempSavePath(nowChooseXml.rootName); EditorGUILayout.BeginHorizontal(); GUILayout.Label("下载临时文件保存路径(电脑的绝对路径,无法更改)"); autoopen = EditorGUILayout.Toggle("下载完自动打开", autoopen); EditorGUILayout.EndHorizontal(); EditorGUILayout.Space(); EditorGUILayout.TextField(tempSaveDir); //自动导入 autoimport = EditorGUILayout.BeginToggleGroup("下载完自动导入", autoimport); GUILayout.Label("导入工程路径(Asset/下的相对路径)"); importdir = EditorGUILayout.TextField(importdir); EditorGUILayout.EndToggleGroup(); EditorGUILayout.Space(); //子文件 infopos = EditorGUILayout.BeginScrollView(infopos); for (int i = 0; i < nowChooseXml.itemList.Count; i++) { EditorGUILayout.Space(); DownloadXMLItem tempItep = nowChooseXml.itemList[i]; EditorGUILayout.BeginHorizontal(); GUILayout.Label((i + 1).ToString(), GUILayout.Width(20)); GUILayout.TextField(tempItep.fileName, GUILayout.Width(300)); GUILayout.TextArea(tempItep.info); GUILayout.TextField(tempItep.size, GUILayout.Width(100)); if (allowDownload && GUILayout.Button("下载", GUILayout.Width(100))) { object[] objee = new object[6] { downloadRootUrl + "/" + tempItep.url, Path.Combine(tempSaveDir, tempItep.fileName), Path.Combine(importdir, tempItep.fileName), autoopen, autoimport, tempItep.size }; GoDownload(objee); window.RemoveNotification(); window.ShowNotification(new GUIContent("开始下载" + tempItep.fileName + "\r\n" + "文件大小:" + tempItep.size)); } if (folderMode == "Audio") { if (GUILayout.Button("试听(网页)", GUILayout.Width(100))) { System.Diagnostics.Process.Start(webAudioUrl + "/" + tempItep.url); } } else if (folderMode == "Photo") { if (GUILayout.Button("浏览(网页)", GUILayout.Width(100))) { System.Diagnostics.Process.Start(downloadRootUrl + "/" + tempItep.url); } } else if (folderMode == "Video") { if (GUILayout.Button("观看(网页)", GUILayout.Width(100))) { System.Diagnostics.Process.Start(webVideoUrl + "/" + tempItep.url); } } else if (folderMode == "General") { if (GUILayout.Button("下载(网页)", GUILayout.Width(100))) { System.Diagnostics.Process.Start(downloadRootUrl + "/" + tempItep.url); } } EditorGUILayout.EndHorizontal(); } EditorGUILayout.EndScrollView(); } private void Update() { if (!isShowBar) { EditorUtility.ClearProgressBar(); return; } bool isCancel = EditorUtility.DisplayCancelableProgressBar("下载中...", (downPragrass * 100).ToString("F2") + "%", downPragrass); if (isCancel) { window.RemoveNotification(); window.ShowNotification(new GUIContent("取消下载:" + Path.GetFileName(saveFilePath))); CloseAll(); isShowBar = false; string ts = (DateTime.Now - downloadBeginTime).TotalSeconds.ToString("F2"); Debug.Log("下载取消用时:" + ts + "秒,"); Debug.Log("---------------------------------------------------------"); } if (downPragrass >= 1) { window.RemoveNotification(); window.ShowNotification(new GUIContent("下载成功,详情在Console窗口")); isShowBar = false; } } void CloseAll() { if (downLoadThread != null) { downLoadThread.Interrupt(); downLoadThread.Abort(); downLoadThread = null; } if (so != null) { so.Close(); so.Dispose(); so = null; } if (st != null) { st.Close(); st.Dispose(); st = null; } if (!string.IsNullOrEmpty(saveFilePath)) { File.Delete(saveFilePath); saveFilePath = ""; } } void GoDownload(object path) { downloadBeginTime = DateTime.Now; downPragrass = 0; isShowBar = true; CloseAll(); downLoadThread = new Thread(Download); downLoadThread.IsBackground = true; downLoadThread.Start(path); } private void Download(object obj) { string URL = ((object[])obj)[0].ToString(); saveFilePath = ((object[])obj)[1].ToString(); string fileCopyToPath = Path.Combine(dataPath, ((object[])obj)[2].ToString()); bool _autoopen = (bool)((object[])obj)[3]; bool _autoimport = (bool)((object[])obj)[4]; string _fileSize = ((object[])obj)[5].ToString(); string dir = Path.GetDirectoryName(saveFilePath); if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } downPragrass = 0; isShowBar = true; HttpWebRequest Myrq = (HttpWebRequest)WebRequest.Create(URL); HttpWebResponse myrp = (HttpWebResponse)Myrq.GetResponse(); long fileLength = myrp.ContentLength; Debug.Log("开始下载"); st = myrp.GetResponseStream(); so = new FileStream(saveFilePath, FileMode.Create); long totalDownloadedByte = 0; byte[] by = new byte[1024]; int osize = st.Read(by, 0, by.Length); while (osize > 0) { totalDownloadedByte = osize + totalDownloadedByte; so.Write(by, 0, osize); osize = st.Read(by, 0, by.Length); downPragrass = totalDownloadedByte / (float)fileLength; } so.Close(); so.Dispose(); st.Close(); st.Dispose(); downPragrass = 1; if (_autoopen) { System.Diagnostics.ProcessStartInfo info = new System.Diagnostics.ProcessStartInfo(); info.FileName = saveFilePath; info.Arguments = ""; try { System.Diagnostics.Process pro = System.Diagnostics.Process.Start(info); } catch (Exception e) { Debug.LogError(e.Message); } } Debug.Log("临时文件保存成功,路径:" + saveFilePath); if (_autoimport) { try { string fileCopyDir = Path.GetDirectoryName(fileCopyToPath); if (!Directory.Exists(fileCopyDir)) Directory.CreateDirectory(fileCopyDir); File.Copy(saveFilePath, fileCopyToPath, true); Debug.Log("导入工程,路径:" + fileCopyToPath); } catch (Exception) { } } string ts = (DateTime.Now - downloadBeginTime).TotalSeconds.ToString("F2"); Debug.Log("下载结束,文件大小:" + _fileSize + ",用时:" + ts + "秒,"); Debug.Log("---------------------------------------------------------"); saveFilePath = ""; } public string HttpGet(string Url, string postDataStr) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url + (postDataStr == "" ? "" : "?") + postDataStr); request.Method = "GET"; request.ContentType = "text/html;charset=UTF-8"; HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Stream myResponseStream = response.GetResponseStream(); StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8")); string retString = myStreamReader.ReadToEnd(); myStreamReader.Close(); myResponseStream.Close(); return retString; } private List HandleXML(string xml) { List xmlList = new List(); XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(xml); XmlNode resources = xmlDoc.SelectSingleNode("UnityResources"); foreach (XmlElement res in resources) { DownloadXML newXml = new DownloadXML(); newXml.rootName = res.GetAttribute("floder_name"); newXml.autoOpen = (res.GetAttribute("auto_open") == "false") ? false : true; newXml.autoImport = (res.GetAttribute("auto_import") == "false") ? false : true; newXml.importPath = res.GetAttribute("import_path"); newXml.folderMode = res.GetAttribute("folder_mode"); newXml.allowDownload = (res.GetAttribute("allow_download") == "false") ? false : true; foreach (XmlElement item in res.ChildNodes) { DownloadXMLItem newItem = new DownloadXMLItem(); newItem.fileName = item.GetAttribute("filename"); newItem.url = item.GetAttribute("url"); string info = item.GetAttribute("info"); newItem.info = info; long sizeL = long.Parse(item.GetAttribute("size")); newItem.size = ConvertFileSize(sizeL); newXml.itemList.Add(newItem); } xmlList.Add(newXml); } return xmlList; } public string GetTempSavePath(string floder) { return Application.temporaryCachePath + "/PackageCache/" + floder + "/"; } public static string ConvertFileSize(long size) { string result = "0KB"; int filelength = size.ToString().Length; if (filelength < 4) result = size + "byte"; else if (filelength < 7) result = Math.Round(Convert.ToDouble(size / 1024d), 2) + "KB"; else if (filelength < 10) result = Math.Round(Convert.ToDouble(size / 1024d / 1024), 2) + "MB"; else if (filelength < 13) result = Math.Round(Convert.ToDouble(size / 1024d / 1024 / 1024), 2) + "GB"; else result = Math.Round(Convert.ToDouble(size / 1024d / 1024 / 1024 / 1024), 2) + "TB"; return result; } } public class DownloadXML { public string rootName; public bool autoOpen; public bool autoImport; public string importPath; public string folderMode; public bool allowDownload; public List itemList; public DownloadXML() { itemList = new List(); } } public class DownloadXMLItem { public string fileName; public string url; public string info; public string size; } }