using System.Collections; using System.Collections.Generic; using UnityEngine; using ZXK.UTility; using Newtonsoft.Json; using UnityEngine.Playables; using DG.Tweening; /******************************************************************************* *Create By CG *Function 考试管理 *******************************************************************************/ namespace ZXK.ZPS { public class ExamManager : MonoBehaviour { private DataItemModel _curExamInfo = null; public DataItemModel _CurExamInfo { get => _curExamInfo; } private ExamBaseCtrl _curExamBaseCtrl = null; [SerializeField] private ExamResultScoreCtrl _curScoreCtrl = null; [SerializeField] public PlayableDirector _WQBExamDirector = null; [SerializeField]//凿毛墙面 private Transform _zaoMaoTrans = null; [SerializeField]//搅拌机桶 private Transform _jiaobanjiTongTrans = null; [SerializeField]//旋转短支撑后显示数值 private TextMesh _rotDuanzhichengTxt = null; [SerializeField]//操作说明 private GameObject _OIGeo = null; public bool _ToolOpenState = false;//判断是否打开工具箱,控制语音文本生成位置 /// /// 判断是否可以自由控制摄像机, /// 如果允许自由切换摄像机,按键后才允许自由切换,否则并没有自由控制 /// private bool _freeCamera = false; private Transform _curCamera = null; private Transform _curCameraParent = null; private Dictionary _curExamResultData = new Dictionary(); //private string _filePath = null; private void Awake() { GameRoot.Instance._ExamMng = this; } private void Start() { //_filePath = System.IO.Path.Combine(Application.streamingAssetsPath, ConstCtrl.DATA_ExamResult_PATH); _OIGeo.SetActive(true); _curCamera = Camera.main.transform; _curCameraParent = Camera.main.transform.parent; FreeCamera(true); //CloseProcess(); } private void Update() { if (_freeCamera) { if (Input.GetMouseButton(1) || Input.mouseScrollDelta.y != 0 || Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.D)) { _curCameraParent.GetComponent().enabled = _freeCamera; _curCamera.GetComponent().enabled = !_freeCamera; } } } private void OnDestroy() { SpeakManager.Instance.StopSpaek(); } #region TimeLine相关 public void Pause() { //DOTween.Kill("jiaobanjiTongTrans");//临时建立个位置 _WQBExamDirector.Pause(); } public void Play() { _WQBExamDirector.Play(); } public void PlayZaoMao(bool play) { _zaoMaoTrans.GetComponent().material.SetFloat("_Height", 0.0f); _zaoMaoTrans.GetComponent().material.DOFloat(5.0f, "_Height", 2.0f); } public void JiaobantongRot() { DOTween.Kill("jiaobanjiTongTrans"); _jiaobanjiTongTrans.localRotation = Quaternion.Euler(0, 0, 0); _jiaobanjiTongTrans.DOLocalRotate(new Vector3(358.0f, 0, 0), 0.1f).SetLoops(-1, LoopType.Incremental).SetId("jiaobanjiTongTrans"); } /// /// 摄像机是否可控,是否处于闲置状态 /// /// public void FreeCamera(bool free) { _freeCamera = free; if (_freeCamera) {//父子结合 if (_curCamera.parent == _curCameraParent) { _curCamera.SetParent(null); } _curCameraParent.position = _curCamera.position; _curCameraParent.rotation = Quaternion.Euler(0, _curCamera.rotation.eulerAngles.y, 0); _curCamera.SetParent(_curCameraParent); } else {//父子分离 _curCamera.SetParent(null); } if (_freeCamera) return; _curCameraParent.GetComponent().enabled = free; _curCamera.GetComponent().enabled = !free; } /// /// 下一步 /// public void NextProcess() { //GameRoot.Instance._DataUICtrl.NextProcess(); //PopUpMng.PopAlert($"请点击下一个科目{GameRoot.Instance._CurFirstProcess}-{GameRoot.Instance._NextSecondProcess}", 100); } /// /// 结束当前timeline /// public void OverProcessLine() { _WQBExamDirector.Pause(); if (GameRoot.Instance._CurType == EnumCtrl.Type.WQB) { PopUpMng.PopVoiceAlert("恭喜您完成“装配式剪力墙内墙板装配”考核任务", "考核结束", 2, 5); } else if (GameRoot.Instance._CurType == EnumCtrl.Type.DHB) { PopUpMng.PopVoiceAlert("恭喜您完成“装配式叠合板装配”考核任务", "考核结束", 2, 5); } //PopUpMng.PopVoiceAlert("恭喜您完成“装配式剪力墙内墙板装配”考核任务", 5); GameRoot.Instance._DataUICtrl.SaveLookData(); //PopUpMng.PopAlert("", 0); //PopUpMng.PopToast("完成任务", "恭喜您完成“装配式剪力墙内墙板装配”考核任务", "返回", OverProcess); } private void OverProcess() { GameRoot.Instance.ReturnExit(); } #endregion public void OpenProcess(DataItemModel dataInfo) { _curExamInfo = dataInfo; _curExamBaseCtrl?.HideSecond(); GameRoot.Instance._DataUICtrl.AllowToolSubmin(true); string contentStr = $"欢迎进入\"{GameRoot.Instance._CurFirstProcess}-{GameRoot.Instance._CurSecondProcess}\"考核,请点击确定开始考核"; if (GameRoot.Instance._CurType == EnumCtrl.Type.WQB) PopUpMng.PopToast("开始考核", contentStr, "确定", EnterShowHintInfo); else if (GameRoot.Instance._CurType == EnumCtrl.Type.DHB) PopUpMng.PopToast("开始考核", contentStr, "确定", EnterShowDHBHintInfo); } private void EnterShowHintInfo() { string[] id = _CurExamInfo.ID.Split('-'); transform.Find("Type0").gameObject.SetActive(true); transform.Find($"Type0/First{id[1]}").gameObject.SetActive(true); _curExamBaseCtrl = transform.Find($"Type0/First{id[1]}/Second{id[2]}").GetComponent(); _curExamBaseCtrl.ShowSecond(); _WQBExamDirector.Stop(); switch (id[1])//GameRoot.Instance._CurFirstProcess { case "0"://操作人员准备 switch (id[2]) { case "0"://安全防护准备 _WQBExamDirector.initialTime = 0.1; GameRoot.Instance._DataUICtrl.AllowToolSubmin(false); break; case "1"://操作人员认知90 _WQBExamDirector.initialTime = 90 / 50.0f; GameRoot.Instance._DataUICtrl.AllowToolSubmin(false); break; } break; case "1"://构件质量检查 switch (id[2]) { case "0"://外观质量检查 _WQBExamDirector.initialTime = 390 / 50.0f; break; case "1"://预埋件检查 _WQBExamDirector.initialTime = 760 / 50.0f; break; case "2"://灌浆孔检查 _WQBExamDirector.initialTime = 1000 / 50.0f; break; } break; case "2"://测量放线 switch (id[2]) { case "0"://距离测量 _WQBExamDirector.initialTime = 1210 / 50.0f; break; case "1"://标记位置 _WQBExamDirector.initialTime = 1365 / 50.0f; break; case "2"://弹线 _WQBExamDirector.initialTime = 1540 / 50.0f; break; } break; case "3"://吊装准备 switch (id[2]) { case "0"://连接面处理 _WQBExamDirector.initialTime = 1740 / 50.0f; break; case "1"://插筋检查 _WQBExamDirector.initialTime = 1895 / 50.0f; break; case "2"://插筋校正 _WQBExamDirector.initialTime = 1965 / 50.0f; break; case "3"://插筋核查 _WQBExamDirector.initialTime = 2020 / 50.0f; break; case "4"://插筋清理 _WQBExamDirector.initialTime = 2070 / 50.0f; break; } break; case "4"://标高控制 Debug.Log(id[2]+"?数字是??"); switch (id[2]) { case "0"://架设仪器 _WQBExamDirector.initialTime = 2235 / 50.0f; break; case "1"://放置后视点 _WQBExamDirector.initialTime = 2270/ 50.0f; break; case "2"://第一点标高测 _WQBExamDirector.initialTime = 2480/ 50.0f; break; case "3"://放置垫片1 _WQBExamDirector.initialTime = 2555/ 50.0f; break; case "4"://第一点标高校 _WQBExamDirector.initialTime = 2610/ 50.0f; break; case "5"://第二点标高测 _WQBExamDirector.initialTime = 2678/ 50.0f; break; case "6"://放置垫片2 _WQBExamDirector.initialTime = 2720/ 50.0f; break; case "7"://第二点标高校 _WQBExamDirector.initialTime = 2773/ 50.0f; break; case "8"://第三点标高测 _WQBExamDirector.initialTime = 2825/ 50.0f; break; case "9"://放置垫片3 _WQBExamDirector.initialTime = 2918/ 50.0f; break; case "10"://第三点标高校 _WQBExamDirector.initialTime = 2970/ 50.0f; break; case "11"://第四点标高测 _WQBExamDirector.initialTime = 3035/ 50.0f; break; case "12"://放置垫片4 _WQBExamDirector.initialTime = 3085/ 50.0f; break; case "13"://第四点标高校 _WQBExamDirector.initialTime = 3135/ 50.0f; break; } break; case "5"://接缝处理 switch (id[2]) { case "0"://安装橡塑棉条 _WQBExamDirector.initialTime = 3238 / 50.0f; break; } break; case "6"://支撑准备 switch (id[2]) { case "0"://长斜支撑准备 _WQBExamDirector.initialTime = 3308 / 50.0f; break; case "1"://短斜支撑准备 _WQBExamDirector.initialTime = 3343 / 50.0f; break; } break; case "7"://坐浆准备 switch (id[2]) { case "0"://坐浆料制拌 _WQBExamDirector.initialTime = 3405 / 50.0f; break; case "1"://吊运坐浆料 _WQBExamDirector.initialTime = 3570 / 50.0f; break; case "2"://坐浆 _WQBExamDirector.initialTime = 3961 / 50.0f; break; } break; case "8"://吊装试吊 switch (id[2]) { case "0"://吊具选型 _WQBExamDirector.initialTime = 4140 / 50.0f; break; case "1"://核对构件信息 _WQBExamDirector.initialTime = 4215 / 50.0f; break; case "2"://挂钩 _WQBExamDirector.initialTime = 6073 / 50.0f; GameRoot.Instance._DataUICtrl.AllowToolSubmin(false); break; case "3"://试吊起吊 _WQBExamDirector.initialTime = 6150 / 50.0f; break; } break; case "9"://墙板吊装就位 switch (id[2]) { case "0"://墙板就位 _WQBExamDirector.initialTime = 6810 / 50.0f; break; case "1"://安装斜支撑 _WQBExamDirector.initialTime = 7010 / 50.0f; break; case "2"://紧固斜支撑 _WQBExamDirector.initialTime = 7160 / 50.0f; break; } break; case "10"://构件调整 switch (id[2]) { case "0"://左右 调整 _WQBExamDirector.initialTime = 7500 / 50.0f; break; case "1"://核查前后 _WQBExamDirector.initialTime = 7600 / 50.0f; break; case "2"://前后调整 _WQBExamDirector.initialTime = 7790 / 50.0f; GameRoot.Instance._DataUICtrl.AllowToolSubmin(false); break; case "3"://垂直度检查 _WQBExamDirector.initialTime = 7970 / 50.0f; break; case "4"://平整度检查 _WQBExamDirector.initialTime = 8090 / 50.0f; break; case "5"://紧固斜向支撑 _WQBExamDirector.initialTime = 8202 / 50.0f; break; } break; case "11"://取钩 switch (id[2]) { case "0"://取钩 _WQBExamDirector.initialTime = 8395 / 50.0f; break; } break; case "12"://分仓封堵 switch (id[2]) { case "0"://分仓封堵 _WQBExamDirector.initialTime = 8520 / 50.0f; break; } break; } _WQBExamDirector.Play(); //PopUpMng.PopVoiceAlert(_CurExamInfo.VoiceHint, 100); //PopUpMng.PopAlert(_CurExamInfo.AnmHint, 100); } private void EnterShowDHBHintInfo() { string[] id = _curExamInfo.ID.Split('-'); _curExamBaseCtrl = transform.Find($"Type0/First{id[1]}/Second{id[2]}").GetComponent(); _curExamBaseCtrl.ShowSecond(); switch (id[1])//GameRoot.Instance._CurFirstProcess { case "0"://构件质量检查 switch (id[2]) { case "0"://外观质量检查 _WQBExamDirector.Stop(); _WQBExamDirector.initialTime = 50 / 50.0f; break; case "1"://预埋件检查 _WQBExamDirector.Stop(); _WQBExamDirector.initialTime = 370 / 50.0f; break; } break; case "1"://施工准备 switch (id[2]) { case "0"://安全防护准备 _WQBExamDirector.Stop(); _WQBExamDirector.initialTime = 530 / 50.0f; GameRoot.Instance._DataUICtrl.AllowToolSubmin(false); break; case "1"://操作人员认知 _WQBExamDirector.Stop(); _WQBExamDirector.initialTime = 610 / 50.0f; GameRoot.Instance._DataUICtrl.AllowToolSubmin(false); break; } break; case "2"://定位放线 switch (id[2]) { case "0"://构件信息核对 _WQBExamDirector.Stop(); _WQBExamDirector.initialTime = 900 / 50.0f; break; case "1"://测量放线 _WQBExamDirector.Stop(); _WQBExamDirector.initialTime = 2765 / 50.0f; break; case "2"://标高控制线 _WQBExamDirector.Stop(); _WQBExamDirector.initialTime = 3095 / 50.0f; break; } break; case "3"://搭设支撑 switch (id[2]) { case "0"://独立支撑三角撑 _WQBExamDirector.Stop(); _WQBExamDirector.initialTime = 3705 / 50.0f; break; case "1"://搭设支撑撑杆 _WQBExamDirector.Stop(); _WQBExamDirector.initialTime = 3765 / 50.0f; break; case "2"://安装支撑顶托 _WQBExamDirector.Stop(); _WQBExamDirector.initialTime = 3835 / 50.0f; break; case "3"://放置支撑龙骨 _WQBExamDirector.Stop(); _WQBExamDirector.initialTime = 3925 / 50.0f; break; case "4"://调整水平 _WQBExamDirector.Stop(); _WQBExamDirector.initialTime = 4055 / 50.0f; break; case "5"://放板边线、位置线 _WQBExamDirector.Stop(); _WQBExamDirector.initialTime = 4420 / 50.0f; break; } break; case "4"://吊装准备 switch (id[2]) { case "0"://吊具选择 _WQBExamDirector.Stop(); _WQBExamDirector.initialTime = 4655 / 50.0f; break; case "1"://连接构件 _WQBExamDirector.Stop(); _WQBExamDirector.initialTime = 4775 / 50.0f; break; case "2"://试吊 _WQBExamDirector.Stop(); _WQBExamDirector.initialTime = 4885 / 50.0f; break; } break; case "5"://起吊安装 switch (id[2]) { case "0"://构件吊装 _WQBExamDirector.Stop(); _WQBExamDirector.initialTime = 5005 / 50.0f; break; case "1"://叠合板安装 _WQBExamDirector.Stop(); _WQBExamDirector.initialTime = 5405 / 50.0f; break; case "2"://构件调整 _WQBExamDirector.Stop(); _WQBExamDirector.initialTime = 5520 / 50.0f; break; case "3"://摘吊钩 _WQBExamDirector.Stop(); _WQBExamDirector.initialTime = 5665 / 50.0f; break; } break; } _WQBExamDirector.Play(); //if (!Camera.main.GetComponent().enabled) //{ // Transform targetTranPos = GameObject.Find($"CM ClearShot1/CM vcam{id[1]}{id[2]}0").transform; // Debug.Log("目标地址:" + targetTranPos.name); // Camera.main.transform.DOMove(targetTranPos.position, 0.5f); // Camera.main.transform.DORotate(targetTranPos.rotation.eulerAngles, 0.5f); //} //PopUpMng.PopVoiceAlert(_curExamInfo.VoiceHint, 100); //PopUpMng.PopAlert(_curExamInfo.AnmHint, 100); } //public void CloseProcess() //{ // for (int i = 0; i < transform.childCount; i++) // { // for (int j = 0; j < transform.GetChild(i).childCount; j++) // { // for (int k = 0; k < transform.GetChild(0).GetChild(j).childCount; k++) // { // transform.GetChild(i).GetChild(j).GetChild(k).gameObject.SetActive(false);//关闭二级工序 // } // transform.GetChild(i).GetChild(j).gameObject.SetActive(false);//关闭一级工序 // } // transform.GetChild(i).gameObject.SetActive(false);//关闭类型 // } //} public bool ToolSubmitBtn(List selectTool) { if (selectTool!=null) { _curExamBaseCtrl.ToolSubmitBtn(selectTool); } return true; } #region 数据相关操作 /// /// 从文件读取数据 /// private Dictionary>> ReadExamResultData() { //string examReslutStr = TxtFileHandle.ReadAllTxt(_filePath); //string examReslutStr = TxtFileHandle.ReadAllTxtByResource(ConstCtrl.DATA_ExamResult_PATH); string examReslutStr = TxtFileHandle.ReadAllTxtByPrefs(ConstCtrl.DATA_ExamResult_Key); Dictionary>> dataArray = JsonConvert.DeserializeObject>>>(examReslutStr); if (dataArray == null) dataArray = new Dictionary>>(); return dataArray; } /// /// 将数据写入文件 /// private void WriteExamResultData(Dictionary>> dataArray) { string examResultStr = JsonConvert.SerializeObject(dataArray); //TxtFileHandle.WriteAllTxt(_filePath, examResultStr, true); TxtFileHandle.WriteAllTxtByPrefs(ConstCtrl.DATA_ExamResult_Key, examResultStr); } public void SaveFirstProExamData() { if (_curExamResultData.Count <= 0) return; //获取现有数据 Dictionary>> data = ReadExamResultData(); //整理顺序顺序 Dictionary tempExamData = new Dictionary(); List tempOrder = GameRoot.Instance._DataUICtrl.GetSecondProcessOrder(); for (int i = 0; i < tempOrder.Count; i++) { if (_curExamResultData.ContainsKey(tempOrder[i])) { tempExamData.Add(tempOrder[i], _curExamResultData[tempOrder[i]]); } else { bool include = false; if (data.ContainsKey(GameRoot.Instance._CurType.ToString())) {//包含当前类 if (data[GameRoot.Instance._CurType.ToString()].ContainsKey(GameRoot.Instance._CurFirstProcess)) {//包含第一步 if (data[GameRoot.Instance._CurType.ToString()][GameRoot.Instance._CurFirstProcess].ContainsKey(tempOrder[i])) {//包含第二步 include = true; tempExamData.Add(tempOrder[i], data[GameRoot.Instance._CurType.ToString()][GameRoot.Instance._CurFirstProcess][tempOrder[i]]); } } } if (!include) { //选中了流程,没有操作的操作分为0 Dictionary> curFirstProcess = new Dictionary>(); if (GameRoot.Instance._CurType == EnumCtrl.Type.WQB) { curFirstProcess = GameRoot.Instance.DataWQBArray; } else if (GameRoot.Instance._CurType == EnumCtrl.Type.DHB) { curFirstProcess = GameRoot.Instance.DataDHBArray; } string[] tools = curFirstProcess[GameRoot.Instance._CurFirstProcess.ToString()][tempOrder[i]].Tools; DataExamModel examResult = new DataExamModel(tools, null); tempExamData.Add(tempOrder[i], examResult); Debug.Log("跳过了该操作步骤"); } } } _curExamResultData = tempExamData; if (data.Count == 0||!data.ContainsKey(GameRoot.Instance._CurType.ToString())) { data.Add(GameRoot.Instance._CurType.ToString(), new Dictionary>()); data[GameRoot.Instance._CurType.ToString()].Add(GameRoot.Instance._CurFirstProcess, _curExamResultData); } else { if (data[GameRoot.Instance._CurType.ToString()].Count == 0 || !data[GameRoot.Instance._CurType.ToString()].ContainsKey(GameRoot.Instance._CurFirstProcess)) { data[GameRoot.Instance._CurType.ToString()].Add(GameRoot.Instance._CurFirstProcess, _curExamResultData); } else { data[GameRoot.Instance._CurType.ToString()].Remove(GameRoot.Instance._CurFirstProcess); data[GameRoot.Instance._CurType.ToString()].Add(GameRoot.Instance._CurFirstProcess, _curExamResultData); } } WriteExamResultData(data); _curExamResultData.Clear(); } public void SaveAllExamData() { Dictionary>> data = ReadExamResultData(); _curScoreCtrl.ShowBriefScore(data); } /// /// 将每个第二工序完成的流程存储到临时变量中 /// /// public void SetCurExamData(string[] useTool) { DataExamModel examResult = new DataExamModel(_CurExamInfo.Tools, useTool); if (_curExamResultData.ContainsKey(GameRoot.Instance._CurSecondProcess)) { _curExamResultData[GameRoot.Instance._CurSecondProcess] = examResult; } else { _curExamResultData.Add(GameRoot.Instance._CurSecondProcess, examResult); } SaveFirstProExamData(); } #endregion } }