using ICSharpCode.SharpZipLib.Zip; using Kirurobo; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using RenderHeads.Media.AVProMovieCapture; using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.IO; using System.Linq; using System.Text; using System.Text.RegularExpressions; using TMPro; using Unity.VisualScripting; using UnityEngine; using UnityEngine.UI; using VRS.Util; using static MainCanvasManager; public class MenuPanel : PanelBasic { /// /// 视频录制按钮 /// public Button video_record_button; /// /// 查看媒体按钮 /// public Button view_media_button; /// /// 导入媒体按钮 /// public Button import_media_button; /// /// 重置场景按钮 /// public Button reset_scene_button; /// /// 保存形象按钮 /// public Button save_image_button; /// /// 提交按钮 /// public Button submit_button; /// /// 暂存按钮 /// public Button staging_button; /// /// 下载按钮 /// public Button download_button; /// /// 文件路径 /// public string file_path; public TextMeshProUGUI video_record_text; /// /// 屏幕录制组件 /// public CaptureFromScreen capture; /// /// 是否正在录制 /// public bool isCapture; public GameObject 录制标志obj; /// /// 左侧主菜单 /// public GameObject UI_主; /// /// 录制按钮 /// public GameObject UI_录; /// /// 视频录制按钮 /// public GameObject 退出按钮; /// /// 暂存完成确认按钮 /// public GameObject 暂存完成确认按钮; protected override void Awake() { base.Awake(); } private void Start() { /* if (GameManager.current_main_menu_type == MainMenuType.自由编程 || GameManager.current_main_menu_type == MainMenuType.案例中心) { submit_button.gameObject.SetActive(false); staging_button.gameObject.SetActive(false); download_button.gameObject.SetActive(false); } video_record_button.onClick.AddListener(() => OnVideoRecord()); import_media_button.onClick.AddListener(() => OnImportMedia()); view_media_button.onClick.AddListener(() => OnMediaViwer()); save_image_button.onClick.AddListener(() => OnSaveImage()); submit_button.onClick.AddListener(() => { MyOnSubmit(); }); reset_scene_button.onClick.AddListener(() => OnResetScene()); staging_button.onClick.AddListener(() => { MyOnStaging(); }); download_button.onClick.AddListener(() => { MyOnDownload(); }); */ // OnDownload(); //ClearDirectory(CallForTest.instance.pathProject); } public void MyOnStaging() { //判断是否有文件 if (Directory.GetFiles(CallForTest.instance.pathProject).Length > 0 || Directory.GetDirectories(CallForTest.instance.pathProject).Length > 0) { MainCanvasManager.confirm_panel.OnPopup("是否暂存当前工作目录?", "", _callback: isok => { if (isok) { OnStaging("暂存"); } }); } else { MainCanvasManager.confirm_panel.OnPopup("未打开代码工程,无需暂存", ""); } } public void MyOnDownload() { MainCanvasManager.confirm_panel.OnPopup("此操作将会覆盖当前工作目录文件,是否要下载上次暂存的代码?", "", _callback: isok => { if (isok) { OnDownload(); } }); } public void MyOnSubmit() { MainCanvasManager.confirm_panel.OnPopup("是否提交当前任务?", "", _callback: isok => { if (isok) { OnSubmit(); } }); } public void OnVideoRecord() { if (!isCapture) { StartVideoRecord(); } else { StopVideoRecord(); } } /// /// 开始录制 /// public void StartVideoRecord() { Debug.Log(111); if (capture != null) { capture.OutputFolderPath = CallForTest.instance.pathTaskFile; capture.FilenamePrefix = "任务"; capture.AppendFilenameTimestamp = false; 录制标志obj.SetActive(true); isCapture = true; //这里暂时关掉提示录制得功能 /* //提示是否开始录制 MainCanvasManager.confirm_panel.OnPopup("录制确认", "是否开始录屏?", "提示", result => { if (result) { isCapture = true; capture.StartCapture(); Debug.Log("开始录制"); video_record_text.text = "结束录制"; video_record_text.color = Color.red; 录制标志obj.SetActive(true); } }); */ capture.StartCapture(); } } /// /// 结束录制 /// public void StopVideoRecord() { if (capture != null) { isCapture = false; capture.StopCapture(); Debug.Log("停止录制"); video_record_text.text = "开始录制"; video_record_text.color = Color.white; 录制标志obj.SetActive(false); //这里可以直接打开录制视频所在路径,但是当前功能不需要所以这里禁用掉 /* //提示录制结束,打开所在文件路径 MainCanvasManager.confirm_panel.OnPopup("录制完成", "录制完成,是否打开文件路径?", "提示", result => { if (result) { Utils.ShowInExplorer(CaptureBase.LastFileSaved); } }); */ } } /// /// 导入媒体 /// public void OnImportMedia() { //Path = base.OpenProject(); //OpenSingleFile(); //Debug.Log(file_path); var _res = OpenFile.OpenFileWin(); if (_res != null) { //是否有新增 bool _add_new = false; //是否仅有音频 bool _only_audio; //文件类型 string _type; if (_res.Length == 1) { _type = _res[0].Split('.')[^1]; //_type = _res[0].Split('.')[_res[0].Split('.').Length - 1]; _add_new |= media_viwer_panel.Init(_type, _res[0].Split('\\')[^1], _res[0]); //_add_new |= media_viwer_panel.Init(_type, _res[0].Split('\\')[_res[0].Split('\\').Length - 1], _res[0]); _only_audio = _type == "mp3"; } else { _only_audio = true; var _path = _res[0]; for (int i = 1; i < _res.Length; i++) { _type = _res[i].Split('.')[1]; _add_new |= media_viwer_panel.Init(_res[i].Split('.')[1], _res[i], _path + "\\" + _res[i]); _only_audio &= _type == "mp3"; } } if (_add_new) { //如果有新增,则打开媒体查看面板 media_viwer_panel.OnPopup(); //切换到对应标签,若都有,则显示视频,只有音频,显示音频 //todo if (_only_audio) { media_viwer_panel.audio_files_button.isOn = true; media_viwer_panel.OnVideoFiles(false); media_viwer_panel.OnAudioFiles(true); } else { media_viwer_panel.video_files_button.isOn = true; media_viwer_panel.OnVideoFiles(true); media_viwer_panel.OnAudioFiles(false); } } } else { } } /// /// 查看媒体资源 /// public void OnMediaViwer() { media_viwer_panel.OnPopup(); } public void OnSaveImage() { //Instantiate(OneImage, Canvas); } /// /// 原提交部分 /// #region /// /// 提交按钮 /// public void OnSubmit() { buttonFunctionAdd.Instance.开始项目.kill(); ConsolePanel.ConsoleOutput("开始提交任务数据", "log"); WebSocketServerManager.Instance.SendMessage(ToolsEventEnum.DataSunmit, "开始提交任务数据"); //任务分数回传 Task_Setp_Back.instance.TaskInfoDataBack(task_panel.task_item_data, ScoreManager.Instance.total_score, (result, msg) => { if (result) { ConsolePanel.ConsoleOutput("提交任务数据完成", "log"); WebSocketServerManager.Instance.SendMessage(ToolsEventEnum.DataSunmit, "提交任务数据完成"); if (File.Exists(CallForTest.instance.pathTaskFile + "/任务.png")) { //有截图,回传任务截图 SubmitJT(); } else if(File.Exists(CallForTest.instance.pathTaskFile + "/任务.mp4")) { //没截图,回传任务录屏 ConsolePanel.ConsoleOutput("无任务截图提交", "log"); WebSocketServerManager.Instance.SendMessage(ToolsEventEnum.DataSunmit, "无任务截图提交"); SubmitLP(); } else { //也没录屏,回传步骤截图 ConsolePanel.ConsoleOutput("无任务截图提交", "log"); WebSocketServerManager.Instance.SendMessage(ToolsEventEnum.DataSunmit, "无任务截图提交"); ConsolePanel.ConsoleOutput("无任务录屏提交", "log"); WebSocketServerManager.Instance.SendMessage(ToolsEventEnum.DataSunmit, "无任务录屏提交"); SubmitStepJT(); } } else { ConsolePanel.ConsoleOutput("提交任务分数失败", "error"); WebSocketServerManager.Instance.SendMessage(ToolsEventEnum.DataSunmit, "提交任务分数失败"); confirm_panel.OnPopup("提交任务分数失败", msg); } }); } /// /// 提交任务截图 /// private void SubmitJT() { ConsolePanel.ConsoleOutput("开始提交任务截图", "log"); WebSocketServerManager.Instance.SendMessage(ToolsEventEnum.DataSunmit, "开始提交任务截图"); Task_Setp_Back.instance.TaskPictureBack(task_panel.task_item_data, File.ReadAllBytes(CallForTest.instance.pathTaskFile + "/任务.png"), ConsolePanel.ConsoleOutput("0%", "log"), (isok1, msg1) => { if (isok1) { ConsolePanel.ConsoleOutput("提交任务截图完成", "log"); WebSocketServerManager.Instance.SendMessage(ToolsEventEnum.DataSunmit, "提交任务截图完成"); if (File.Exists(CallForTest.instance.pathTaskFile + "/任务.mp4")) { //有录屏,回传录屏 SubmitLP(); } else { //没录屏,回传步骤截图 ConsolePanel.ConsoleOutput("无任务录屏提交", "log"); WebSocketServerManager.Instance.SendMessage(ToolsEventEnum.DataSunmit, "无任务录屏提交"); SubmitStepJT(); } } else { ConsolePanel.ConsoleOutput("提交任务截图失败", "error"); WebSocketServerManager.Instance.SendMessage(ToolsEventEnum.DataSunmit, "提交任务截图失败"); confirm_panel.OnPopup("提交任务截图失败", msg1); } }); } /// /// 提交任务录屏 /// private void SubmitLP() { ConsolePanel.ConsoleOutput("开始提交任务录屏", "log"); WebSocketServerManager.Instance.SendMessage(ToolsEventEnum.DataSunmit, "开始提交任务录屏"); //上传minio UpLoadFileToMinio(CallForTest.instance.pathTaskFile + "/任务.mp4", (isok0, downPath) => { if (isok0) { ConsolePanel.ConsoleOutput("提交任务录屏完成", "log"); WebSocketServerManager.Instance.SendMessage(ToolsEventEnum.DataSunmit, "提交任务录屏完成"); ConsolePanel.ConsoleOutput("开始同步云端数据", "log"); WebSocketServerManager.Instance.SendMessage(ToolsEventEnum.DataSunmit, "开始同步云端数据"); //提交数据 Task_Setp_Back.instance.TaskVideoBack(task_panel.task_item_data, downPath, (isok1, msg1) => { if (isok1) { ConsolePanel.ConsoleOutput("同步云端数据完成", "log"); WebSocketServerManager.Instance.SendMessage(ToolsEventEnum.DataSunmit, "同步云端数据完成"); //回传步骤截图 SubmitStepJT(); } else { ConsolePanel.ConsoleOutput("同步云端数据失败", "error"); WebSocketServerManager.Instance.SendMessage(ToolsEventEnum.DataSunmit, "同步云端数据失败"); confirm_panel.OnPopup("同步云端数据失败", msg1); } }); } else { ConsolePanel.ConsoleOutput("提交任务录屏失败", "error"); WebSocketServerManager.Instance.SendMessage(ToolsEventEnum.DataSunmit, "提交任务录屏失败"); confirm_panel.OnPopup("提交任务录屏失败", ""); WebSocketServerManager.Instance.SendMessage(ToolsEventEnum.DataSunmit, "提交任务录屏失败"); } }); } /// /// 提交步骤截图 /// private void SubmitStepJT() { List files= new List(); Directory.GetFiles(CallForTest.instance.pathTaskFile).ToList().ForEach(a => { string filename= Path.GetFileName(a); if(filename.StartsWith("步骤_")) { files.Add(filename); } }); if(files.Count>0) { ConsolePanel.ConsoleOutput("开始提交步骤截图", "log"); WebSocketServerManager.Instance.SendMessage(ToolsEventEnum.DataSunmit, "开始提交步骤截图"); SubmOneStepJT(files, 0); } else { ConsolePanel.ConsoleOutput("无步骤截图提交", "log"); WebSocketServerManager.Instance.SendMessage(ToolsEventEnum.DataSunmit, "无步骤截图提交"); //暂存文件 TijiaoFile(); } } /// /// 上传单个步骤截图 /// private void SubmOneStepJT(List files, int index) { if (index < files.Count) { string tmpFileName = files[index]; TaskStep step = task_panel.task_item_data.task_steplist.Find(a => "步骤_" + a.stepName + ".png" == tmpFileName); if (step != null) { ConsolePanel.ConsoleOutput("开始提交步骤截图:" + tmpFileName, "log"); WebSocketServerManager.Instance.SendMessage(ToolsEventEnum.DataSunmit, "开始提交步骤截图"); Task_Setp_Back.instance.StepPictureBack(step, tmpFileName, File.ReadAllBytes(CallForTest.instance.pathTaskFile + "/" + tmpFileName), ConsolePanel.ConsoleOutput("0%", "log"), (isok, msg) => { if (isok) { ConsolePanel.ConsoleOutput("提交成功:" + tmpFileName, "log"); WebSocketServerManager.Instance.SendMessage(ToolsEventEnum.DataSunmit, "提交成功"); //提交下一个 SubmOneStepJT(files, index + 1); } else { ConsolePanel.ConsoleOutput("提交步骤截图失败" + tmpFileName, "error"); WebSocketServerManager.Instance.SendMessage(ToolsEventEnum.DataSunmit, "提交步骤截图失败"); confirm_panel.OnPopup("提交步骤截图失败" + tmpFileName, msg); } }); } else { //找不到此步骤,提交下一个 Debug.Log("找不到图片对应的步骤"); WebSocketServerManager.Instance.SendMessage(ToolsEventEnum.DataSunmit, "找不到图片对应的步骤"); SubmOneStepJT(files, index + 1); } } else { Debug.Log("结束步骤截图提交"); WebSocketServerManager.Instance.SendMessage(ToolsEventEnum.DataSunmit, "步骤截图全部提交完成"); ConsolePanel.ConsoleOutput("步骤截图全部提交完成", "log"); //提交文件 TijiaoFile(); } } private void TijiaoFile() { //判断是否有文件 if (Directory.GetFiles(CallForTest.instance.pathProject).Length > 0 || Directory.GetDirectories(CallForTest.instance.pathProject).Length > 0) { ConsolePanel.ConsoleOutput("开始提交代码工程", "log"); WebSocketServerManager.Instance.SendMessage(ToolsEventEnum.DataSunmit, "开始提交代码工程"); OnStaging("提交"); } else { ConsolePanel.ConsoleOutput("无代码工程可提交", "error"); WebSocketServerManager.Instance.SendMessage(ToolsEventEnum.DataSunmit, "无代码工程可提交"); WebSocketServerManager.Instance.SendMessage(ToolsEventEnum.DataSunmit, "提交完成"); confirm_panel.OnPopup("提交完成", "可以退出房间了"); } } /// /// 上传文件到minio地址 /// private void UpLoadFileToMinio(string filePath, Action callback) { //md5值 FileStream file = new FileStream(filePath, FileMode.Open); long length = file.Length; System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider(); byte[] retVal = md5.ComputeHash(file); file.Close(); StringBuilder sb = new StringBuilder(); for (int i = 0; i < retVal.Length; i++) { sb.Append(retVal[i].ToString("x2")); } string md5value = sb.ToString(); Debug.Log("上传文件:" + Path.GetFileName(filePath) + " MD5:" + md5value); string url = InterfaceManager.IdAddress + ":8080/minio/tasks/upload/" + md5value + "?totalSize=" + length + "&fileName=" + Path.GetFileName(filePath) + "&bucketName=ictcomcache"; Debug.Log("获取上传地址:" + url); //获取文件上传地址 ConsolePanel.ConsoleOutput("获取文件上传地址", "log"); WebSocketServerManager.Instance.SendMessage(ToolsEventEnum.DataSunmit, "获取文件上传地址"); StartCoroutine(Task_Setp_Back.Get(url, false, (isok, result) => { if (isok) { if (!string.IsNullOrEmpty(result)) { JObject jo = JObject.Parse(result); Debug.Log(result); if (jo["code"].ToObject() == 200) { string presignedUrl = jo["data"]["taskRecord"]["presignedUrl"].ToString(); string downloadPath = jo["data"]["path"].ToString(); Debug.Log("presignedUrl:" + presignedUrl); Debug.Log("downloadPath:" + downloadPath); if (jo["data"]["finished"].ToObject() == false) { //未上传 ConsolePanel.ConsoleOutput("开始上传", "log"); WebSocketServerManager.Instance.SendMessage(ToolsEventEnum.DataSunmit, "开始上传"); //上传文件 StartCoroutine(Task_Setp_Back.Put(presignedUrl, File.ReadAllBytes(filePath), ConsolePanel.ConsoleOutput("0%", "log"), (isok1, result1) => { if (isok1) { ConsolePanel.ConsoleOutput("上传完成100%", "log"); WebSocketServerManager.Instance.SendMessage(ToolsEventEnum.DataSunmit, "上传完成100%"); Debug.Log("文件上传成功"); callback(true, downloadPath); } else { ConsolePanel.ConsoleOutput("暂存失败"+ result1, "log"); //confirm_panel.OnPopup("暂存失败", result1); WebSocketServerManager.Instance.SendMessage(ToolsEventEnum.DataSunmit, "暂存失败"); callback(false, null); } })); } else { //文件md5重复 Debug.Log("文件已存在,无需上传"); WebSocketServerManager.Instance.SendMessage(ToolsEventEnum.DataSunmit, "文件已存在无需上传"); callback(true, downloadPath); } } else { //confirm_panel.OnPopup("暂存失败", jo["msg"].ToString()); ConsolePanel.ConsoleOutput("暂存失败"+ jo["msg"].ToString(), "log"); WebSocketServerManager.Instance.SendMessage(ToolsEventEnum.DataSunmit, "暂存失败"); callback(false, null); } } else { ConsolePanel.ConsoleOutput("暂存失败", "log"); //confirm_panel.OnPopup("暂存失败", ""); // WebSocketServerManager.Instance.SendMessage(ToolsEventEnum.DataSunmit, "暂存失败"); callback(false, null); } } else { ConsolePanel.ConsoleOutput("暂存失败"+ result,"log"); WebSocketServerManager.Instance.SendMessage(ToolsEventEnum.DataSunmit, "暂存失败"); callback(false, null); } })); } #endregion /// /// 重置场景 /// public void OnResetScene() { on_reset_scene?.Invoke(); } /// /// 暂存 /// #region public void OnStaging(string actionMsg) { //zip压缩包 string outpath = CallForTest.instance.pathCache+ "/TmpCode.zip"; string inpath = CallForTest.instance.pathProject; if (File.Exists(outpath)) { File.Delete(outpath); } ConsolePanel.ConsoleOutput("开始压缩0%", "log"); WebSocketServerManager.Instance.SendMessage(ToolsEventEnum.TemporaryStorage,"开始压缩0%"); System.IO.Compression.ZipFile.CreateFromDirectory(inpath, outpath); //Zip zip = new Zip(); //Encoding gbk = Encoding.GetEncoding("GBK"); //ZipStrings.CodePage = gbk.CodePage; //if (zip.ZipFileDictory(inpath, outpath)) { ConsolePanel.ConsoleOutput("压缩完成100%", "log"); WebSocketServerManager.Instance.SendMessage(ToolsEventEnum.TemporaryStorage, "压缩完成100%"); Debug.Log("压缩完成100%"); UpLoadFileToMinio(outpath, (isok0, downPath) => { if (isok0) { //更新数据库 string url2 = InterfaceManager.IdAddress + ":8080/component/userCodeingInfo"; ConsolePanel.ConsoleOutput("开始更新云端数据", "log"); WebSocketServerManager.Instance.SendMessage(ToolsEventEnum.TemporaryStorage, "开始更新云端数据"); if (CallForTest.instance.saveInfo == null) { //没有暂存过 MyTmpSaveInfo saveInfo = new MyTmpSaveInfo(); // 暂时改动,暂时把任务id和userId删掉了 saveInfo.taskId = CallForTest.instance.currentTaskData.task_id; saveInfo.userId = CallForTest.instance.user.userId; saveInfo.dataType = "TmpCode.zip"; saveInfo.dataContent = downPath; StartCoroutine(Task_Setp_Back.Post(url2, JsonConvert.SerializeObject(saveInfo), null,(isok1, result1) => { if (isok1) { JObject jo1 = JObject.Parse(result1); if (jo1["code"].ToObject() == 200) { CallForTest.instance.saveInfo = saveInfo; if (actionMsg == "提交") { 退出按钮.SetActive(true); 退出按钮.transform.GetChild(1).GetComponent().text = "提交完成,是否退出程序"; } else if (actionMsg == "暂存") { 暂存完成确认按钮.SetActive(true); 暂存完成确认按钮.transform.GetChild(1).GetComponent().text = "暂存完成"; } ConsolePanel.ConsoleOutput(actionMsg + "提交文件成功", "log"); WebSocketServerManager.Instance.SendMessage(ToolsEventEnum.TemporaryStorage, "提交成功"); } else { ConsolePanel.ConsoleOutput(actionMsg+"失败"+ jo1["msg"].ToString(),"log"); } } else { ConsolePanel.ConsoleOutput(actionMsg+ "失败" + result1,"log"); } })); } else { //有暂存记录 MyTmpSaveInfo saveInfo = new MyTmpSaveInfo(); saveInfo.id = CallForTest.instance.saveInfo.id; saveInfo.taskId = CallForTest.instance.saveInfo.taskId; saveInfo.userId = CallForTest.instance.saveInfo.userId; saveInfo.dataType = CallForTest.instance.saveInfo.dataType; saveInfo.dataContent = downPath; StartCoroutine(Task_Setp_Back.Post(url2, JsonConvert.SerializeObject(saveInfo), null,(isok1, result1) => { if (isok1) { CallForTest.instance.saveInfo.dataContent = downPath; if (actionMsg == "提交") { 退出按钮.SetActive(true); 退出按钮.transform.GetChild(1).GetComponent().text = "提交完成,是否退出程序"; } else if(actionMsg == "暂存") { 暂存完成确认按钮.SetActive(true); 暂存完成确认按钮.transform.GetChild(1).GetComponent().text = "暂存完成"; } ConsolePanel.ConsoleOutput(actionMsg+"提交文件成功", "log"); WebSocketServerManager.Instance.SendMessage(ToolsEventEnum.TemporaryStorage, "提交成功"); } else { ConsolePanel.ConsoleOutput(actionMsg+"失败"+ result1,"log"); } })); } } }); } } #endregion /// /// 下载 /// public void OnDownload() { buttonFunctionAdd.Instance.开始项目.kill(); // MainCanvasManager.Instance.transform.Find("Main").transform.GetChild(0).GetChild(0).GetComponent().DownLoadProject(true); DownLoadProject(); } /// /// 下载当前目录 /// public void DownLoadProject() { //gameObject.SetActive(true); //先清空临时代码目录 if (GameManager.current_main_menu_type == MainMenuType.课程任务) { if (CallForTest.instance != null && CallForTest.instance.currentTaskData != null && CallForTest.instance.currentTaskData.programDto != null && !string.IsNullOrEmpty(CallForTest.instance.currentTaskData.programDto.programPackageFileUrl)) { //查看是否有暂存 string url1 = InterfaceManager.IdAddress + ":8080/component/userCodeingInfo/getDetail?taskId=" + CallForTest.instance.currentTaskData.task_id + "&userId=" + CallForTest.instance.user.userId + "&dataType=TmpCode.zip"; ConsolePanel.ConsoleOutput("正在检测是否有暂存工程", "log"); WebSocketServerManager.Instance.SendMessage(ToolsEventEnum.DataReading, "正在检测是否有暂存工程"); StartCoroutine(InterfaceManager.Get(url1, (isok, result) => { if (isok) { JObject jb1 = JObject.Parse(result); if (jb1["code"].ToObject() == 200) { if (jb1["data"].ToString()!= "") { //测试输出 //ConsolePanel.ConsoleOutput(jb1["data"].ToString(), "log"); //有则下载暂存工程 CallForTest.instance.saveInfo = JsonConvert.DeserializeObject(jb1["data"].ToString()); Debug.Log(jb1); Debug.Log(jb1["data"].ToString()); string zipurl = CallForTest.instance.saveInfo.dataContent; if (!string.IsNullOrEmpty(zipurl)) { ConsolePanel.ConsoleOutput("开始下载暂存工程", "log"); WebSocketServerManager.Instance.SendMessage(ToolsEventEnum.DataReading, "开始下载缓存工程"); LoadPakageAndUnpackZip(zipurl, CallForTest.instance.saveInfo.dataType); } } else { ConsolePanel.ConsoleOutput("开始下载初始代码包0%", "log"); WebSocketServerManager.Instance.SendMessage(ToolsEventEnum.DataReading, "开始下载初始代码包0%"); //没有则下载程序包 LoadPakageAndUnpackZip(CallForTest.instance.currentTaskData.programDto.programPackageFileUrl, CallForTest.instance.currentTaskData.programDto.programPackageFileName); } } else { ConsolePanel.ConsoleOutput("获取暂存数据失败"+ jb1["msg"].ToString(),"log"); WebSocketServerManager.Instance.SendMessage(ToolsEventEnum.DataReading, "获取暂存数据失败"); } } else { ConsolePanel.ConsoleOutput("获取暂存数据失败"+result,"log"); WebSocketServerManager.Instance.SendMessage(ToolsEventEnum.DataReading, "获取暂存数据失败"); } })); } else { ConsolePanel.ConsoleOutput("未找到代码文件", "error"); WebSocketServerManager.Instance.SendMessage(ToolsEventEnum.DataReading, "未找到代码文件"); } } else if (GameManager.current_main_menu_type == MainMenuType.案例中心) { if (CallForTest.instance != null && CallForTest.instance.currentTaskData != null && CallForTest.instance.currentTaskData.programDto != null && !string.IsNullOrEmpty(CallForTest.instance.currentTaskData.programDto.programPackageFileUrl)) { //直接下载程序包 ConsolePanel.ConsoleOutput("开始下载初始代码包0%", "log"); WebSocketServerManager.Instance.SendMessage(ToolsEventEnum.DataReading, "开始下载初始代码包0%"); LoadPakageAndUnpackZip(CallForTest.instance.currentTaskData.programDto.programPackageFileUrl, CallForTest.instance.currentTaskData.programDto.programPackageFileName); } else { ConsolePanel.ConsoleOutput("未找到代码文件", "error"); WebSocketServerManager.Instance.SendMessage(ToolsEventEnum.DataReading, "未找到代码文件"); } } //自由模式暂不提供下载代码 /* else if (GameManager.current_main_menu_type == MainMenuType.自由编程) { //工程目录初始化 //UnityEngine.Debug.LogError(CallForTest.instance.pathFreeProjectRoot+"hahaha"); if (Directory.GetFiles(CallForTest.instance.pathFreeProjectRoot + "/Python").Length == 0) File.Copy(CallForTest.instance.pathRoot + "/main.py", CallForTest.instance.pathFreeProjectRoot + "/Python/main.py", true); ConsolePanel.ConsoleOutput("开始下载初始代码包0%", "log"); WebSocketServerManager.Instance.SendMessage(ToolsEventEnum.DataReading, "开始下载初始代码包0%"); //File.Copy(CallForTest.instance.pathRoot + "/main.py", CallForTest.instance.pathFreeProjectRoot + "/Python/main.py", true); //File.Copy(CallForTest.instance.pathRoot + "/main.py", CallForTest.instance.pathFreeProjectRoot + "/Python/main.py", true); //启用按钮 //runPython.gameObject.SetActive(true); //runJava.gameObject.SetActive(true); //runC.gameObject.SetActive(true); } */ } /// /// 下载工程包,并解压到临时工程文件夹 /// /// /// private void LoadPakageAndUnpackZip(string packageUrl, string packageName) { StartCoroutine(InterfaceManager.GetData(packageUrl, ConsolePanel.ConsoleOutput("0%", "log"), (isok2, data) => { ConsolePanel.ConsoleOutput("下载完成100%", "log"); WebSocketServerManager.Instance.SendMessage(ToolsEventEnum.DataReading, "下载完成100%"); UnityEngine.Debug.Log("下载完成:" + packageUrl); if (isok2 && data != null) { ClearDirectory(CallForTest.instance.pathCache); string zipname = CallForTest.instance.pathCache + "/" + packageName; File.WriteAllBytes(zipname, data); //清空临时工程目录 ClearDirectory(CallForTest.instance.pathProject); ConsolePanel.ConsoleOutput("开始解压0%", "log"); WebSocketServerManager.Instance.SendMessage(ToolsEventEnum.DataReading, "开始解压0%"); System.IO.Compression.ZipFile.ExtractToDirectory(zipname, CallForTest.instance.pathProject, Encoding.GetEncoding("GBK"), true); //解压zip到目标目录 //Zip zip = new Zip(); //Encoding gbk = Encoding.GetEncoding("GBK"); //ZipStrings.CodePage = gbk.CodePage; //zip.Extract(zipname, pathProject + "/", 2048); ConsolePanel.ConsoleOutput("解压完成100%", "log"); WebSocketServerManager.Instance.SendMessage(ToolsEventEnum.DataReading, "解压完成100%"); //启用按钮 //runPython.gameObject.SetActive(CallForTest.instance.currentTaskData.programDto.programLanguage == "Python"); //runJava.gameObject.SetActive(CallForTest.instance.currentTaskData.programDto.programLanguage == "Java"); //runC.gameObject.SetActive(CallForTest.instance.currentTaskData.programDto.programLanguage == "C"); } else { UnityEngine.Debug.Log("下载失败:" + packageUrl); WebSocketServerManager.Instance.SendMessage(ToolsEventEnum.DataReading, "下载失败"); //MainCanvasManager.confirm_panel.OnPopup("下载失败" + packageUrl, ""); ConsolePanel.ConsoleOutput("下载失败"+ packageUrl, "log"); } })); } /// /// 清空文件夹 /// /// private void ClearDirectory(string path) { if (Directory.Exists(path)) { Directory.GetFiles(path).ToList().ForEach(a => { File.Delete(a); }); Directory.GetDirectories(path).ToList().ForEach(a => { Directory.Delete(a, true); }); Debug.Log("已清空文件夹"); } } /// /// 暂存方法 /// public void ZanCunPanel() { Debug.Log("暂存成功"); } /// /// 下载方法 /// public void XiaZaiPanel() { Debug.Log("下载方法"); } /// /// 打开windows选择路径工具 /// private void OpenSingleFile() { FilePanel.Settings settings = new FilePanel.Settings(); settings.filters = new FilePanel.Filter[] { //new FilePanel.Filter("All files", "*"), new FilePanel.Filter("媒体文件(*.png;*.jpg;*.jpeg;*.mp3;*.mp4;*.mov;*.avi;)", "png", "jpg", "jpeg","mp3", "mp4", "mov", "avi"), //new FilePanel.Filter("Vidos files (*.mp4;*.mov;*.avi)", "mp4", "mov", "avi"), //new FilePanel.Filter("Documents (*.txt;*.rtf;*.doc;*.docx)", "txt", "rtf", "doc", "docx"), }; settings.title = "导入媒体"; settings.initialDirectory = System.Environment.GetFolderPath(System.Environment.SpecialFolder.MyPictures); FilePanel.OpenFilePanel(settings, (files) => { file_path = string.Join("\n", files); }); } }