using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; using ZXK.Framework; using ZXK.UTility; using DG.Tweening; /******************************************************************************* *Create By CG *Function 练习和考核模式控制 *******************************************************************************/ namespace ZXK.BYSS { public class PracticeAndExamPanel : UIBase { [MyReadOnly] public PracticeAndExamInSceneCtrl _CurTrainExamSceneCtrl; private Vector3 _cameraPos1 = new Vector3(7.515f, 1.706f, -1.084f); private Vector3 _cameraRot1 = new Vector3(19.4f, -90f, 0); private Vector3 _cameraPos2 = new Vector3(7.515f, 1.706f, 10.92f); private Vector3 _cameraRot2 = new Vector3(19.4f, -90f, 0); private Vector3 _cameraPos3 = new Vector3(6.2803f, 1.3419f, -13.3151f); private Vector3 _cameraRot3 = new Vector3(19.317f, -90f, 0); private Vector3 _cameraPos4 = new Vector3(1.31f, 1.9f, 7.23f); private Vector3 _cameraRot4 = new Vector3(19.317f, -90f, 0); private Vector3 _cameraPos5 = new Vector3(0.6677701f, 1.977f, -8.322083f); private Vector3 _cameraRot5 = new Vector3(30.667f, -90.703f, 0); //当前操作步骤 private DataItemModel _CurProcess = null; //选择的工具生成的临时物体存放此处 private Transform _toolSeleTempParentTran = null; //程序调试按钮 //private Button _debugBtn = null; //刚进入场景有个提示,此时后面出现蒙版不允许点击其他位置 private GameObject _maskPanel = null; private int _packageNumber = 0; //当前步骤需要选择的工具集合 private List _curNeedTools = new List(); //选择的工具不是null,就说明已经选择了,否则就没选 private string _selectToolName = null; private GameObject _curSelectToolGeo = null; private int _selectToolNumber = 0;//当前选择工具数量 //鼠标当前悬浮物体,用于区分鼠标离开物体触发事件 private ItemModelCtrl _curMouseHoverCtrl = null; private Ray _cameraRay; protected override void Awake() { base.Awake(); EventCenterManager.Instance.AddEventListener(EventEnum.PickTool, PickToolCall); EventCenterManager.Instance.AddEventListener(EventEnum.ChangeProcess, ChangeProcessCall); } private void Start() { _toolSeleTempParentTran = GetWedage("DragTools_N").transform; _maskPanel = GetWedage("EnterMask_N"); _CurProcess = null; EventCenterManager.Instance.Dispatch(EventEnum.ChangeProcess, this, null); GetTools();//获取工具 GetCurNeedTools(); switch (AppManagement.Instance._CurType) { case EnumCtrl.Type.None: break; case EnumCtrl.Type.XHBY: Camera.main.transform.DOMove(_cameraPos1, 0f); Camera.main.transform.DORotate(_cameraRot1, 0f); break; case EnumCtrl.Type.QDCY: Camera.main.transform.DOMove(_cameraPos2, 0f); Camera.main.transform.DORotate(_cameraRot2, 0f); break; case EnumCtrl.Type.CLFJ: Camera.main.transform.DOMove(_cameraPos3, 0f); Camera.main.transform.DORotate(_cameraRot3, 0f); break; case EnumCtrl.Type.ZNYD: Camera.main.transform.DOMove(_cameraPos4, 0f); Camera.main.transform.DORotate(_cameraRot4, 0f); break; case EnumCtrl.Type.BYSS: Camera.main.transform.DOMove(_cameraPos5, 0f); Camera.main.transform.DORotate(_cameraRot5, 0f); break; default: break; } //刚进入弹窗提示 _maskPanel.gameObject.SetActive(true); if (_CurTrainExamSceneCtrl!=null&&_CurTrainExamSceneCtrl.speakManager!=null) { ///音频管理器设置音频组,播放音频 _CurTrainExamSceneCtrl.speakManager.ChangeModelAudio("设备组装"); //音频管理器播放配音 _CurTrainExamSceneCtrl.speakManager.Init(); _CurTrainExamSceneCtrl.speakManager.PlayAudioCilp(); } } private void OnEnable() { string hintStr = null; foreach (HintModel.AppHintData item in AppManagement.Instance._HintData._AppHints) { if (item._AppName.Equals(EnumCtrl.GetEnumDescription(AppManagement.Instance._CurType))) { hintStr = item._TrainHints[0]._TrainHint; } } PopUpMng.PopToast("实训任务", hintStr, "确定", () => { _maskPanel.gameObject.SetActive(false); }); } private void Update() { if (!string.IsNullOrEmpty(_selectToolName) && _curSelectToolGeo) { Vector3 worldPos = Camera.main.ScreenToWorldPoint(new Vector3( Input.mousePosition.x, Input.mousePosition.y, 1.0f)); _curSelectToolGeo.transform.position = worldPos; ItemModelCtrl itemCtrl = null; _cameraRay = Camera.main.ScreenPointToRay(Input.mousePosition); if (PopUpMng._TriAble && Physics.Raycast(_cameraRay, out RaycastHit cast) && !EventSystem.current.IsPointerOverGameObject()) { //Debug.Log(cast.transform.name); //Debug.DrawLine(_cameraRay.origin, cast.point, Color.red, 0.5f); itemCtrl = cast.transform.GetComponent(); if (itemCtrl) { _curSelectToolGeo.transform.position = itemCtrl.transform.position; _curSelectToolGeo.transform.rotation = itemCtrl.transform.rotation; //_curSelectToolGeo.transform.localScale = itemCtrl.transform.localScale; _curMouseHoverCtrl?.DefaultAlphaState(); itemCtrl.HoverState(); _curMouseHoverCtrl = itemCtrl; if (Input.GetMouseButtonDown(0)) { if (_curMouseHoverCtrl) { //判断位置放置是否准确 bool right = false; string hoverProess = _curMouseHoverCtrl._ProcessName; string curProess = _CurProcess.ProcessName; //int indexH = hoverProess.LastIndexOf('('); //int indexC = curProess.LastIndexOf('('); //if (indexH > 0 && indexC > 0) //{ // hoverProess = hoverProess.Substring(0, indexH); // curProess = curProess.Substring(0, indexC); //} if (hoverProess.Equals(curProess)) { for (int i = 0; i < _curMouseHoverCtrl._NeedToolsName.Length; i++) { if (_curMouseHoverCtrl._NeedToolsName[i].Equals(_selectToolName)) { right = true; } } } if (!right) {//放错了 _CurProcess.RealityPlace = _curMouseHoverCtrl._ProcessName; PopUpMng.PopCustomFailToast("位置错误", "您当前选择的元器件不在此处放置,请选择其他位置安装放置", "确认", () => { _packageNumber++; if (AppManagement.Instance._CurModel == EnumCtrl.Model.Train&& _packageNumber == 3) { ErroPackageAuto(); } else if (AppManagement.Instance._CurModel == EnumCtrl.Model.Teach&& _packageNumber == 3) { ErroPackageAuto(); } }); } else { _selectToolNumber++; } //判断工具是否选择全面,全面后显示零件 if (_selectToolNumber == _curMouseHoverCtrl._NeedToolsName.Length) { PopUpMng.PopCustomSucToast("操作成功", "恭喜你成功完成设备组装", "确认", () => { _CurTrainExamSceneCtrl.ShowProcessPart(_CurProcess); _selectToolNumber = 0; if (_CurTrainExamSceneCtrl.speakManager!=null) { //增加音频索引号 _CurTrainExamSceneCtrl.speakManager.AddAudioCilp(); _CurTrainExamSceneCtrl.speakManager.PlayAudioCilp(); } if (AppManagement.Instance._CurModel == EnumCtrl.Model.Exam) { //截屏操作为图片功能 #if UNITY_EDITOR || UNITY_STANDALONE #region PC端 string temppath = System.IO.Path.Combine( System.IO.Path.GetTempPath(), //ConstCtrl.DATA_PICTURE_TEMP_FOLDER, AppManagement.Instance._CurType.ToString(), _CurProcess.ProcessName + ".png"); #endregion #elif UNITY_WEBGL //操作正确截屏 #region 网页版 string temppath = ""; #endregion #endif UtilitiesMng.StartScreenshot(temppath, (string vul) => { #if UNITY_EDITOR || UNITY_STANDALONE _CurProcess.RightImg = temppath; #elif UNITY_WEBGL WDebug.Log("保存截图:" + _CurProcess.RightImg); _CurProcess.RightImg = vul; #endif _selectToolName = null; _curMouseHoverCtrl = null; EventCenterManager.Instance.Dispatch(EventEnum.ChangeProcess, this, null); }); } else if (AppManagement.Instance._CurModel == EnumCtrl.Model.Train) { _selectToolName = null; _curMouseHoverCtrl = null; EventCenterManager.Instance.Dispatch(EventEnum.ChangeProcess, this, null); WDebug.Log("Train!!!!!!!!!!!!!!!!!!!!!!"); } else if (AppManagement.Instance._CurModel == EnumCtrl.Model.Teach) { _selectToolName = null; _curMouseHoverCtrl = null; EventCenterManager.Instance.Dispatch(EventEnum.ChangeProcess, this, null); } }); } else { _curMouseHoverCtrl?.DefaultAlphaState(); _selectToolName = null; _curMouseHoverCtrl = null; } } Destroy(_curSelectToolGeo); _selectToolName = null; } } } if (itemCtrl == null) { _curMouseHoverCtrl?.DefaultAlphaState(); } } } protected override void OnDestroy() { base.OnDestroy(); EventCenterManager.Instance.RemoveListener(EventEnum.PickTool, PickToolCall); EventCenterManager.Instance.RemoveListener(EventEnum.ChangeProcess, ChangeProcessCall); //_isShowVideo = false; // _videoTran.gameObject.SetActive(false); } /// /// 从总数居中获取工具 /// private void GetTools() { List tools = new List(); foreach (DataItemModel itemValue in AppManagement.Instance._AppModel.DataJDSBArray[EnumCtrl.GetEnumDescription(AppManagement.Instance._CurType)].Values) { for (int i = 0; i < itemValue.Tools.Length; i++) { if (!tools.Contains(itemValue.Tools[i])) { tools.Add(itemValue.Tools[i]); } } } UIBase toolsUI = UI_Manage.Instance.ShowPanel("ToolsPanel", -1, transform); ToolsPanel toosCtrl = toolsUI.GetComponent(); Transform toosTran = toolsUI.GetComponent(); toosTran.SetAsFirstSibling(); toosCtrl.Init(tools.ToArray()); } /// /// 获取当前步骤需要的工具集合 /// private void GetCurNeedTools() { string[] toolsTemp = AppManagement.Instance._AppModel.DataJDSBArray[ EnumCtrl.GetEnumDescription(AppManagement.Instance._CurType)][_CurProcess.ProcessName].Tools; for (int i = 0; i < toolsTemp.Length; i++) { _curNeedTools.Add(toolsTemp[i]); } } /// /// 鼠标在工具图标上按下 /// private void PickToolCall(object sender, System.EventArgs e) { if (!string.IsNullOrEmpty(_selectToolName)) return; ToolArgs data = e as ToolArgs; //Debug.Log($"订阅者接收到{data._ToolName}的消息"); _selectToolName = data._ToolName; bool selRight = false; string[] curSelectTool = _CurProcess.Tools; for (int i = 0; i < curSelectTool.Length; i++) { if (curSelectTool[i].Equals(_selectToolName)) { selRight = true; break; } } if (selRight) { GameObject itemPrefab = null; foreach (var item in _CurTrainExamSceneCtrl._toolPrefab) { if (item.name.Equals(_selectToolName)) { itemPrefab = item; break; } } if (itemPrefab) { _curSelectToolGeo = Instantiate(itemPrefab, _CurTrainExamSceneCtrl._ToolsTemp); _curSelectToolGeo.name = _selectToolName; _curSelectToolGeo.SetActive(true); } } else { _CurProcess.RealityTools = new string[] { _selectToolName }; PopUpMng.PopCustomFailToast("操作错误", "请按照操作提示选择合适的元器件,放入指定区域", "确认", () => { _selectToolName = null; _packageNumber++; if (AppManagement.Instance._CurModel == EnumCtrl.Model.Train && _packageNumber == 3) { ErroPackageAuto(); } if (AppManagement.Instance._CurModel == EnumCtrl.Model.Teach && _packageNumber == 3) { ErroPackageAuto(); } }); } } /// /// 赋值当前进行到第几步 /// public void ChangeProcessCall(object sender, System.EventArgs e) { if (_CurProcess == null) {//刚开始 _CurProcess = AppManagement.Instance._AppModel.DataJDSBArray[ EnumCtrl.GetEnumDescription(AppManagement.Instance._CurType)].Values.First(); } else { Dictionary curprocess = AppManagement.Instance._AppModel.DataJDSBArray[EnumCtrl.GetEnumDescription(AppManagement.Instance._CurType)]; if (_CurProcess.ID == curprocess.Count - 1) { //最后一步提示文本设置 string curtype=""; switch (AppManagement.Instance._CurType) { case EnumCtrl.Type.XHBY: curtype = "循环搬运机械手"; break; case EnumCtrl.Type.QDCY: curtype = "气动冲压"; break; case EnumCtrl.Type.CLFJ: curtype = "材料分拣"; break; case EnumCtrl.Type.ZNYD: curtype = "智能运动"; break; case EnumCtrl.Type.BYSS: curtype = "搬运输送"; break; } PopUpMng.PopCustomSucToast("组装完成", "恭喜你成功完成"+ curtype + "单元所有设备组装", "开始连线", () => { AppManagement.Instance.ChangeModel(EnumCtrl.Model.Line); }); } if (curprocess.Keys.Contains(_CurProcess.ProcessName)) { int id = curprocess[_CurProcess.ProcessName].ID; foreach (DataItemModel item in curprocess.Values) { if (item.ID == id + 1) { _CurProcess = item; //搬运输送特殊写法 if (AppManagement.Instance._CurType == EnumCtrl.Type.BYSS) {//由于固定块太小了,还嵌在滑块中,所以在组装固定块时,取消滑块触发区域 if (_CurProcess.ProcessName.Equals("皮带固定块")) { for (int i = 0; i < _CurTrainExamSceneCtrl._partModel.Length; i++) { if(_CurTrainExamSceneCtrl._partModel[i].name.Equals("SM_JiXieShouZhiChengJia")|| _CurTrainExamSceneCtrl._partModel[i].name.Equals("SM_TiShengJiGou2") || _CurTrainExamSceneCtrl._partModel[i].name.Equals("SM_TaiShengQiGang") || _CurTrainExamSceneCtrl._partModel[i].name.Equals("组006")) { _CurTrainExamSceneCtrl._partModel[i].GetComponent().enabled = false; } if (_CurTrainExamSceneCtrl._partModel[i].name.Equals("SM_HuaKuai")) { Transform HuaKuaiTran = _CurTrainExamSceneCtrl._partModel[i].transform; _CurTrainExamSceneCtrl.GetComponentInChildren().enabled = false; WDebug.Log("滑块反转"); HuaKuaiTran.DOLocalRotate(Vector3.left * 90.0f, 0.5f); } } } else if (_CurProcess.ProcessName.Equals("机械手支撑架")) { for (int i = 0; i < _CurTrainExamSceneCtrl._partModel.Length; i++) { if (_CurTrainExamSceneCtrl._partModel[i].name.Equals("SM_JiXieShouZhiChengJia")) { _CurTrainExamSceneCtrl._partModel[i].GetComponent().enabled = true; } } } else if (_CurProcess.ProcessName.Equals("提升机构")) { for (int i = 0; i < _CurTrainExamSceneCtrl._partModel.Length; i++) { if (_CurTrainExamSceneCtrl._partModel[i].name.Equals("SM_TiShengJiGou2")) { _CurTrainExamSceneCtrl._partModel[i].GetComponent().enabled = true; } } } else if (_CurProcess.ProcessName.Equals("抬升气缸")) { for (int i = 0; i < _CurTrainExamSceneCtrl._partModel.Length; i++) { if (_CurTrainExamSceneCtrl._partModel[i].name.Equals("SM_TaiShengQiGang")) { _CurTrainExamSceneCtrl._partModel[i].GetComponent().enabled = true; } } } else if (_CurProcess.ProcessName.Equals("气动手指")) { for (int i = 0; i < _CurTrainExamSceneCtrl._partModel.Length; i++) { if (_CurTrainExamSceneCtrl._partModel[i].name.Equals("组006")) { _CurTrainExamSceneCtrl._partModel[i].GetComponent().enabled = true; } } } if (_CurProcess.ProcessName.Equals("主电机同步轮+固定座")) { for (int i = 0; i < _CurTrainExamSceneCtrl._partModel.Length; i++) { if (_CurTrainExamSceneCtrl._partModel[i].name.Equals("SM_HuaKuai")) { Transform HuaKuaiTran = _CurTrainExamSceneCtrl._partModel[i].transform; HuaKuaiTran.DOLocalRotate(Vector3.right * 90.0f, 0.5f).OnComplete(()=> { _CurTrainExamSceneCtrl.GetComponentInChildren().enabled = true; WDebug.Log("滑块规整"); }); } } } } } } } } _packageNumber = 0; PopUpMng.PopAlert(_CurProcess.Hint, -1); } /// /// 组装错误的时候播放自动组装动画 /// private void ErroPackageAuto() { GameObject itemPrefab = null; foreach (var item in _CurTrainExamSceneCtrl._toolPrefab) { if (item.name.Equals(_CurProcess.Tools[0])) { itemPrefab = item; break; } } if (itemPrefab) { _curSelectToolGeo = Instantiate(itemPrefab, _CurTrainExamSceneCtrl._ToolsTemp); _curSelectToolGeo.name = _selectToolName; _curSelectToolGeo.SetActive(true); _curSelectToolGeo.transform.position = Camera.main.transform.position; } Vector3 targPos = Vector3.zero; Quaternion targRat = new Quaternion(); Vector3 targScale = Vector3.zero; for (int i = 0; i < _CurTrainExamSceneCtrl._partModel.Length; i++) { if (_CurTrainExamSceneCtrl._partModel[i]._ProcessName.Equals(_CurProcess.ProcessName)) { targPos = _CurTrainExamSceneCtrl._partModel[i].transform.position; targRat = _CurTrainExamSceneCtrl._partModel[i].transform.rotation; targScale = _CurTrainExamSceneCtrl._partModel[i].transform.localScale; } } Sequence sequence = DOTween.Sequence(); sequence.Append(_curSelectToolGeo.transform.DOMove(targPos, 1.0f)) .Insert(0, _curSelectToolGeo.transform.DORotate(targRat.eulerAngles, 1.0f)) .Insert(0, _curSelectToolGeo.transform.DOScale(targScale, 1.0f)) .OnComplete(() => { _packageNumber = 0; Destroy(_curSelectToolGeo); _CurTrainExamSceneCtrl.ShowProcessPart(_CurProcess); _selectToolNumber = 0; _curMouseHoverCtrl = null; EventCenterManager.Instance.Dispatch(EventEnum.ChangeProcess, this, null); }); } } }