using DG.Tweening; using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using ZXK.Framework; using ZXK.UTility; /******************************************************************************* *Create By CG *Function 场景中端子连线 *******************************************************************************/ namespace ZXK.BYSS { public class ConnectLineCtrl : MonoBehaviour { //线路连接数据 [SerializeField] public LineConnectModel _lineConnectData = null; [SerializeField] private GameObject _chatouPrefab = null; [SerializeField]//所有插头父物体 private Transform _chatouContain = null; public TerminalCtrl _terminalStart = null;//插入的第一个端子..不是null,说明插完一个接头等待插入另一个的状态 public GameObject _chaTouTemp = null;//插入第一个时生成的动态线段 public Transform _chatou0 = null;//插入后需要脱离父物体寻找位置,暂时先提取出来 //计分时查看每个线段应该接多少个小线段 public Dictionary _connectLineDic = new Dictionary(); //智能运动系统内提前预知好的接线线段 public Dictionary _ZNYDLines = new Dictionary(); //每个线段有几个控制板,保证控制板之间只有一个线段连接 public Dictionary> _lineCtrlDic = new Dictionary>(); [Range(0.0f, 1.0f)] private float posx = 0.825f; [Range(0.0f, 1.0f)] private float posy = 0.851f; [Range(0.0f, 1.0f)] private float posz = 0.615f; //[Range(0.0f, 1.0f)] //private float rotx = 0.3f; //[Range(0.0f, 1.0f)] //private float roty = 0.3f; //[Range(0.0f, 1.0f)] //private float rotz = 0.3f; private void Awake() { if (EnumCtrl.GetEnumDescription(AppManagement.Instance._CurType).Equals(transform.name)) { EventCenterManager.Instance.AddEventListener(EventEnum.AutoConnect, AutoLineCall); } } private void OnDestroy() { if (EnumCtrl.GetEnumDescription(AppManagement.Instance._CurType).Equals(transform.name)) { EventCenterManager.Instance.RemoveListener(EventEnum.AutoConnect, AutoLineCall); } } private void Start() { if (EnumCtrl.GetEnumDescription(AppManagement.Instance._CurType).Equals(transform.name)) { _lineConnectData = new LineConnectModel(); StartCoroutine(_lineConnectData.ReadLineConnectDataWeb(transform, GetCtrlTerminals)); AppManagement.Instance._ConnectScore = 0; if (AppManagement.Instance._CurType == EnumCtrl.Type.ZNYD) { //Transform[] lines = .GetComponentsInChildren(true); Transform lines = transform.Find("Aim_ZhiNengYunDongKongZhi/SM_LJDX"); foreach (Transform item in lines) { _ZNYDLines.Add(item.name, item.gameObject); } //for (int i = 1; i < lines.Length; i++) //{ // _ZNYDLines.Add(lines[i].name, lines[i].gameObject); //} } } } GameObject temp; private void Update() { if (AppManagement.Instance._TrainExam==EnumCtrl.Model.Exam) { if (Input.GetMouseButton(2) && _terminalStart) { Debug.Log("可以清除"); DestoryChaTou(); } } else { } } public void InteractionInScene(RaycastHit rayHit) { if (!EnumCtrl.GetEnumDescription(AppManagement.Instance._CurType).Equals(transform.name)) return; Debug.Log("进入连线模式!!!!"); TerminalCtrl terminalCtrl = rayHit.transform.GetComponent(); if (!TerminalInData(rayHit.transform.name)) { //判空判断 if (terminalCtrl != null) { terminalCtrl.InsertLightState(false); } //if (_terminalStart && AppManagement.Instance._TrainExam == EnumCtrl.Model.Train) //{ // Debug.Log("练习模式!!!接线模块"); // //如果练习模式不在数据内,不计次数,只弹窗 // PopUpMng.PopCustomFailToast("操作错误", "请根据端子分配表及接线图正确接线", "确认", null); //} //if (_terminalStart && AppManagement.Instance._TrainExam == EnumCtrl.Model.Teach) //{ // Debug.Log("教学模式!!!接线模块"); // //如果练习模式不在数据内,不计次数,只弹窗 // PopUpMng.PopCustomFailToast("操作错误", "请根据端子分配表及接线图正确接线", "确认", null); //} //考核模式点击错误端子直接弹出提示 PopUpMng.PopCustomFailToast("操作错误", "请根据端子分配表及接线图正确接线", "确认", () => { DestoryChaTou(); }); return; } if (_terminalStart == null) { if (AppManagement.Instance._CurType == EnumCtrl.Type.XHBY || AppManagement.Instance._CurType == EnumCtrl.Type.QDCY || AppManagement.Instance._CurType == EnumCtrl.Type.ZNYD ) { _chaTouTemp = Instantiate(_chatouPrefab, _chatouContain); _chatou0 = _chaTouTemp.transform.Find("ChaTou0"); terminalCtrl.SetChaTouPos(_chatou0); _chaTouTemp.transform.position = _chatou0.position; _chaTouTemp.transform.rotation = _chatou0.rotation; _terminalStart = terminalCtrl; // Debug.Log("生成接头!!!!!!!"); if (AppManagement.Instance._TrainExam == EnumCtrl.Model.Exam) { Debug.Log("考核模式调用这个"); } else { Debug.Log("练习,教学模式调用这个"); SetCurrentIndexAdd(); SetCurrentTerminalCtrl(); } } //材料分拣特殊模式设置 else if (AppManagement.Instance._CurType == EnumCtrl.Type.CLFJ && terminalCtrl._CurTerminalData._ConnectGeos.Count < 1) { if (terminalCtrl._CurTerminalData._TerminalName.Equals("DLB0.3") || terminalCtrl._CurTerminalData._TerminalName.Equals("DLB0.4") || terminalCtrl._CurTerminalData._TerminalName.Equals("DLB0.5")) {//材料分拣中的特殊情况 terminalCtrl.StraightSetChaTouPos(); terminalCtrl._CurTerminalData._ConnectGeos.Add(terminalCtrl.gameObject); if (terminalCtrl._CurTerminalData._TerminalName.Equals("DLB0.3")) { AddScore("12"); } if (terminalCtrl._CurTerminalData._TerminalName.Equals("DLB0.4")) { AddScore("13"); } if (terminalCtrl._CurTerminalData._TerminalName.Equals("DLB0.5")) { AddScore("14"); } CheckAllTerminalConnect(); } else { terminalCtrl.StraightSetChaTouPos(); _terminalStart = terminalCtrl; } if (AppManagement.Instance._TrainExam == EnumCtrl.Model.Exam) { Debug.Log("考核模式调用这个"); } else { Debug.Log("练习,教学模式调用这个"); SetCurrentIndexAdd(); SetCurrentTerminalCtrl(); } } #region ////搬运输送特殊模式设置 else if (AppManagement.Instance._CurType == EnumCtrl.Type.BYSS) { #region 旧的接线逻辑 //if (terminalCtrl._CurTerminalData._ConnectGeos.Count < 1) //{ // if (terminalCtrl._CurTerminalData._TerminalName.Contains("SM-X")) // { // terminalCtrl.StraightSetChaTouPos(); // terminalCtrl._CurTerminalData._ConnectGeos.Add(terminalCtrl.gameObject); // if (terminalCtrl._CurTerminalData._TerminalName.Equals("SM-XA")) // { // AddScore("50"); // } // if (terminalCtrl._CurTerminalData._TerminalName.Equals("SM-XB")) // { // AddScore("51"); // } // if (terminalCtrl._CurTerminalData._TerminalName.Equals("SM-X4")) // { // AddScore("52"); // } // if (terminalCtrl._CurTerminalData._TerminalName.Equals("SM-X6")) // { // AddScore("53"); // } // CheckAllTerminalConnect(); // } // else // { // terminalCtrl.InsertLightState(true); // terminalCtrl._CurTerminalData._ConnectGeos.Add(terminalCtrl.gameObject); // _terminalStart = terminalCtrl; // } //} #endregion //设置接线端子脚本 terminalCtrl.InsertLightState(false); _terminalStart = terminalCtrl; if (AppManagement.Instance._TrainExam == EnumCtrl.Model.Exam) { // Debug.Log("考核模式调用这个"); } else { // Debug.Log("练习,教学模式调用这个"); SetCurrentIndexAdd(); SetCurrentTerminalCtrl(); } } #endregion } else { string sameLineID = _terminalStart._CurTerminalData._LinesID[0]; if (TwoTerminalConnectable(_terminalStart, terminalCtrl, ref sameLineID)) { _terminalStart._ConnectErrorNumber = 0; } else { _terminalStart._ConnectErrorNumber++; } terminalCtrl.InsertLightState(_terminalStart._ConnectErrorNumber == 0); if (_terminalStart._ConnectErrorNumber == 0) { //手动连接成功 TerminalsConnect(_terminalStart, terminalCtrl, sameLineID); AddScore(sameLineID); _terminalStart = null; _chaTouTemp = null; CheckAllTerminalConnect(); //增加索引,调用闪烁UI和和闪烁端子 //智能运动 if (AppManagement.Instance._CurType == EnumCtrl.Type.ZNYD) { if (AppManagement.Instance._TrainExam == EnumCtrl.Model.Exam) { Debug.Log("考核模式调用这个"); } else { Debug.Log("练习,教学模式调用这个"); SetCurrentIndexAdd(); SetCurrentTerminalCtrl(); } } //增加索引,调用闪烁UI和和闪烁端子 //搬运输送 if (AppManagement.Instance._CurType == EnumCtrl.Type.BYSS) { if (AppManagement.Instance._TrainExam == EnumCtrl.Model.Exam) { //Debug.Log("考核模式调用这个"); } else { // Debug.Log("练习,教学模式调用这个"); SetCurrentIndexAdd(); //增加提示索引,步骤提示 var v = UI_Manage.Instance.GetPanel("ConnectPanel").GetComponent(); v.AddByssIndex(); v.SetByssLineTip(); SetCurrentTerminalCtrl(); //配音播放 var a = UI_Manage.Instance.GetPanel("PracticeAndExamPanel").GetComponent(); if (a._CurTrainExamSceneCtrl.speakManager != null) { a._CurTrainExamSceneCtrl.speakManager.AddAudioCilp(); a._CurTrainExamSceneCtrl.speakManager.PlayAudioCilp(); } } } //剩下三个模式 if (AppManagement.Instance._CurType == EnumCtrl.Type.CLFJ|| AppManagement.Instance._CurType == EnumCtrl.Type.QDCY|| AppManagement.Instance._CurType == EnumCtrl.Type.XHBY ) { if (AppManagement.Instance._TrainExam == EnumCtrl.Model.Exam) { Debug.Log("考核调用这个"); } else { Debug.Log("练习,教学模式调用这个"); SetCurrentIndexAdd(); SetCurrentTerminalCtrl(); } } } else {//手动连接成功 PopUpMng.PopCustomFailToast("操作错误", "请根据端子分配表及接线图正确接线", "确认", () => { //练习模式 if (_terminalStart && _terminalStart._ConnectErrorNumber >= 3 && AppManagement.Instance._TrainExam == EnumCtrl.Model.Train) { //将正确接线 if (AutoInsertChaTou(_terminalStart)) { _terminalStart._ConnectErrorNumber = 0; _terminalStart = null; _chaTouTemp = null; CheckAllTerminalConnect(); } else { DestoryChaTou(); } } //教学模式 if (_terminalStart && _terminalStart._ConnectErrorNumber >= 3 && AppManagement.Instance._TrainExam == EnumCtrl.Model.Teach) { //将正确接线 if (AutoInsertChaTou(_terminalStart)) { _terminalStart._ConnectErrorNumber = 0; _terminalStart = null; _chaTouTemp = null; CheckAllTerminalConnect(); } else { DestoryChaTou(); } } //考核模式 if (AppManagement.Instance._TrainExam == EnumCtrl.Model.Exam) { DestoryChaTou(); } }); } } } /// /// 自动接线 /// private void AutoLineCall(object sender, System.EventArgs e) { AutoLine(); CheckAllTerminalConnect(); } [SerializeField, Header("接线表所需要的端子脚本")] List terminalCtrls = new List(); [SerializeField, Header("本次实验所有的端子脚本")] List AllterminalCtrls = new List(); [Header("当前可以操作的端子")] public int CurrentIndex = 0; [SerializeField, Header("UI闪烁和相机位置组")] public List CameraOrUIStrs = new List() { }; [SerializeField, Header("连线事件组")] public List AlllineEvents; [Header("智能运动相机侧视角")] public GameObject ZNYD_Ce_View; [Header("搬运输送相机视角")] public GameObject Byss_Camera1; public GameObject Byss_Camera2; /// /// 获取本次接线要用到的端子 /// 获取这个预制体要用到的端子 /// public void GetAllTerminalCtrl() { ///这个循环是找到表中连接的端子 for (int i = 0; i < _lineConnectData._TerminalDic[EnumCtrl.GetEnumDescription(AppManagement.Instance._CurType)].Count; i++) { TerminalModel[][] terminals = _lineConnectData._TerminalDic[EnumCtrl.GetEnumDescription(AppManagement.Instance._CurType)][i]; for (int j = 0; j < terminals.Length; j++) { if (terminals[j] != null) { for (int k = 0; k < terminals[j].Length; k++) { TerminalCtrl terminal1 = terminals[j][k]._TerminalGeo.GetComponent(); terminalCtrls.Add(terminal1); } } } } ///这个循环是找到预制体下所有的端子 var Scene_terminalCtrls = transform.GetComponentsInChildren(); for (int i = 0; i < Scene_terminalCtrls.Length; i++) { AllterminalCtrls.Add(Scene_terminalCtrls[i]); } if (AppManagement.Instance._CurType == EnumCtrl.Type.ZNYD) { //生成对应表中连接端子的相机或者UI 事件 CameraOrUIStrs = new List() { //0-9 "前","后", "前","后", "前","后", "前","后", "前","后", //10-19 "前","后", "前","前", "前","后", "前","后", "前","后", //20-29 "前","后", "前","前", "前","后1", "前1","侧", "前1","侧", //30-39 "前1","侧", "前1","后1", "前1","后1", "前","无", "无","无", //40-51 "无","无", "无","无", "前","后", "前","无", "无","后", "后1","前" }; } if (AppManagement.Instance._CurType == EnumCtrl.Type.BYSS) { CameraOrUIStrs = new List() { //0-9 "Camera1","Camera1", "Camera1","Camera1", "Camera1","Camera1", "Camera1","Camera1", "Camera1","Camera1", //10-15 "Camera1","Camera1", "Camera2","Camera2", "Camera2","Camera2", //16-20 "Camera2","Camera2", "Camera2","Camera2", "Camera2","Camera2", "Camera2","Camera2", }; } if (AppManagement.Instance._CurType == EnumCtrl.Type.CLFJ) { //材料分拣 45个 CameraOrUIStrs = new List() { "无","无","无","无","无", "无","无","无","无","无", "无","无","无","无","无", "无","无","无","无","无", "无","无","无","无","无", "无","无","无","无","无", "无","无","无","无","无", "无","无","无","无","无", "无","无","无","无","无" }; } if (AppManagement.Instance._CurType == EnumCtrl.Type.XHBY ) { //循环搬运机械手 66个 CameraOrUIStrs = new List() { "无","无","无","无","无", "无","无","无","无","无", "无","无","无","无","无", "无","无","无","无","无", "无","无","无","无","无", "无","无","无","无","无", "无","无","无","无","无", "无","无","无","无","无", "无","无","无","无","无", "无","无","无","无","无", "无","无","无","无","无", "无","无","无","无","无", "无","无","无","无","无", "无", }; } if (AppManagement.Instance._CurType == EnumCtrl.Type.QDCY ) { // 气动冲压 30个 CameraOrUIStrs = new List() { "无","无","无","无","无", "无","无","无","无","无", "无","无","无","无","无", "无","无","无","无","无", "无","无","无","无","无", "无","无","无","无","无" }; } ///添加进对应的事件组 for (int j = 0; j < terminalCtrls.Count; j++) { int num = j; LineEvent _lineEvent = new LineEvent(); _lineEvent.terminalCtrl = terminalCtrls[num]; _lineEvent.CameraOrUI = CameraOrUIStrs[num]; AlllineEvents.Add(_lineEvent); } } /// ///获取当前要显示的端子 ///关掉除了当前端子的其他端子碰撞体 /// 关掉当前场景所有端子的端子碰撞体 /// /// public void SetCurrentTerminalCtrl() { //关掉其他端子碰撞体,和泛光 //for (int i = 0; i < AlllineEvents.Count; i++) //{ // var colliders = AlllineEvents[i].terminalCtrl.transform.GetComponents(); // for (int h = 0; h < colliders.Length; h++) // { // colliders[h].enabled = false; // } // AlllineEvents[i].terminalCtrl.HideHighlightOutLine(); //} //关掉场景中所有接线端子碰撞器 for (int i = 0; i < AllterminalCtrls.Count; i++) { AllterminalCtrls[i].HideHighlightOutLine(); var colliders = AllterminalCtrls[i].transform.GetComponents(); for (int h = 0; h < colliders.Length; h++) { colliders[h].enabled = false; } } //获取ConnetPanel,然后进行设置 var v = UI_Manage.Instance.GetPanel("ConnectPanel").GetComponent(); //结束 if (CurrentIndex == AlllineEvents.Count) { for (int i = 0; i < AlllineEvents.Count; i++) { //关闭所有闪光,碰撞体 var colliders = AlllineEvents[i].terminalCtrl.GetComponents(); for (int h = 0; h < colliders.Length; h++) { colliders[h].enabled = false; } AlllineEvents[i].terminalCtrl.HideHighlightOutLine(); } //关闭闪烁UI v.HideRedImage(); } else { //继续增加 switch (AlllineEvents[CurrentIndex].CameraOrUI) { case "前": v.ShowRedImage(0); break; case "后": v.ShowRedImage(2); break; case "前1": v.ShowRedImage(1); break; case "后1": v.ShowRedImage(3); break; case "侧": //相机右侧视角 Camera.main.GetComponent().enabled = false; Camera.main.transform.position = ZNYD_Ce_View.transform.position; Camera.main.transform.localEulerAngles = ZNYD_Ce_View.transform.localEulerAngles; Camera.main.GetComponent().enabled = true; //当前要点击的端子碰撞体打开 var colliders = AlllineEvents[CurrentIndex].terminalCtrl.GetComponents(); for (int i = 0; i < colliders.Length; i++) { colliders[i].enabled = true; } AlllineEvents[CurrentIndex].terminalCtrl.ShowHighlightOutLine(); break; case "无": //当前端子设置碰撞体 AlllineEvents[CurrentIndex].terminalCtrl.ShowHighlightOutLine(); var col = AlllineEvents[CurrentIndex].terminalCtrl.GetComponents(); for (int i = 0; i < col.Length; i++) { col[i].enabled = true; } break; //相机1 case "Camera1": //搬运输送相机视角1 Camera.main.GetComponent().enabled = false; Camera.main.transform.position = Byss_Camera1.transform.position; Camera.main.transform.rotation = Byss_Camera1.transform.rotation; Camera.main.GetComponent().enabled = true; //当前端子设置碰撞体 var colliders2 = AlllineEvents[CurrentIndex].terminalCtrl.GetComponents(); for (int i = 0; i < colliders2.Length; i++) { colliders2[i].enabled = true; } AlllineEvents[CurrentIndex].terminalCtrl.ShowHighlightOutLine(); break; //相机2 case "Camera2": //搬运输送相机视角2 Camera.main.GetComponent().enabled = false; Camera.main.transform.position = Byss_Camera2.transform.position; Camera.main.transform.rotation = Byss_Camera2.transform.rotation; Camera.main.GetComponent().enabled = true; //当前端子设置碰撞体 var colliders1 = AlllineEvents[CurrentIndex].terminalCtrl.GetComponents(); for (int i = 0; i < colliders1.Length; i++) { colliders1[i].enabled = true; } AlllineEvents[CurrentIndex].terminalCtrl.ShowHighlightOutLine(); break; } } } /// /// 当前索引增加 /// public void SetCurrentIndexAdd() { if (CurrentIndex < AlllineEvents.Count) { CurrentIndex++; } else { Debug.Log("结束。不再增加"); // CurrentIndex = AlllineEvents.Count; } } /// /// 设置当前索引的UI是否点击完成 /// public void SetCurrentUIorCameraBool() { var v = UI_Manage.Instance.GetPanel("ConnectPanel").GetComponent(); //当前要点击的端子闪烁 AlllineEvents[CurrentIndex].terminalCtrl.ShowHighlightOutLine(); //当前要点击的端子碰撞体打开 var col = AlllineEvents[CurrentIndex].terminalCtrl.GetComponents(); for (int i = 0; i < col.Length; i++) { col[i].enabled = true; } v.HideRedImage(); } /// ///点击按钮结束接线 /// public void FinishTerminalCtrl() { //关闭所有端子的碰撞体,与闪光识别 for (int i = 0; i < AlllineEvents.Count; i++) { var colliders = AlllineEvents[i].terminalCtrl.GetComponents(); for (int h = 0; h < colliders.Length; h++) { colliders[h].enabled = false; } AlllineEvents[i].terminalCtrl.HideHighlightOutLine(); } //关闭闪烁UI bool isHave = UI_Manage.Instance.GetPanel("ConnectPanel"); if (isHave) { var v = UI_Manage.Instance.GetPanel("ConnectPanel").GetComponent(); v.HideRedImage(); } else { } } /// /// 导航栏直接调用接线 /// public void AutoLine() { DestoryChaTou(); AutoInsertChaTou(null); FinishTerminalCtrl(); } /// /// 销毁连接错误的线 /// private void DestoryChaTou() { if (_terminalStart) { if (AppManagement.Instance._CurType == EnumCtrl.Type.XHBY || AppManagement.Instance._CurType == EnumCtrl.Type.QDCY || AppManagement.Instance._CurType == EnumCtrl.Type.ZNYD ) { Destroy(_chaTouTemp); DestroyImmediate(_chatou0.gameObject); _terminalStart._ConnectErrorNumber = 0; _terminalStart.ChaTouNumber(false); _terminalStart = null; _chatou0 = null; _chaTouTemp = null; } else if (AppManagement.Instance._CurType == EnumCtrl.Type.CLFJ ) { _terminalStart.RecallStraightChaTouPos(); _terminalStart = null; } else if (AppManagement.Instance._CurType == EnumCtrl.Type.BYSS) { _terminalStart = null; } } } /// /// 自动将插头插入端子 /// 如果不是全部插入,则直插入当前所持有第一个端子对应的线路的关联端子 /// 如果全部插入,则将剩余的全部插入 /// /// 如果全部自动插入,此处为null /// 返回一次自动生成时是否成功 private bool AutoInsertChaTou(TerminalCtrl terminal) { bool isInsert = false; if (terminal) { List linesIndex = new List(terminal._CurTerminalData._LinesID); //筛选出所有与已持有的开始端子相关的线路 List linesTemp = new List(); List linesSrc = _lineConnectData._TerminalDic[EnumCtrl.GetEnumDescription(AppManagement.Instance._CurType)]; for (int i = 0; i < linesIndex.Count; i++) { linesTemp.Add(linesSrc[int.Parse(linesIndex[i]) - 1]); } for (int i = 0; i < linesTemp.Count; i++) { TerminalModel[][] terminals = linesTemp[i]; for (int a = 0; a < terminals.GetLength(0); a++) { if (terminals[a] != null) { for (int b = 0; b < terminals[a].Length; b++) { if (AutoItemCon(terminal, terminals)) return true; } } } } } else { for (int i = 0; i < _lineConnectData._TerminalDic[EnumCtrl.GetEnumDescription(AppManagement.Instance._CurType)].Count; i++) { TerminalModel[][] terminals = _lineConnectData._TerminalDic[EnumCtrl.GetEnumDescription(AppManagement.Instance._CurType)][i]; //_lineConnectData. //foreach (var item in _lineConnectData._TerminalDic["循环搬运机械手虚拟仿真系统"]) //{ //} for (int a = 0; a < terminals.GetLength(0); a++) { if (terminals[a] != null) { for (int b = 0; b < terminals[a].Length; b++) { Debug.Log("!!!!!!!!!!!!" + terminals[a][b]._TerminalGeo.name); TerminalCtrl terminal1 = terminals[a][b]._TerminalGeo.GetComponent(); //如果是材料分拣,有几个特殊端子 if (AppManagement.Instance._CurType == EnumCtrl.Type.CLFJ && ( terminal1._CurTerminalData._TerminalName.Equals("DLB0.3") || terminal1._CurTerminalData._TerminalName.Equals("DLB0.4") || terminal1._CurTerminalData._TerminalName.Equals("DLB0.5"))) { if (terminal1._CurTerminalData._ConnectGeos.Count < 1) { terminal1.StraightSetChaTouPos(); terminal1._CurTerminalData._ConnectGeos.Add(terminal1.gameObject); } } //如果是搬运输送,有几个特殊端子 else if (AppManagement.Instance._CurType == EnumCtrl.Type.BYSS) { if (terminal1._CurTerminalData._ConnectGeos.Count < 1) { terminal1.StraightSetChaTouPos_Rightaway(); terminal1._CurTerminalData._ConnectGeos.Add(terminal1.gameObject); } } else { AutoItemCon(terminals[a][b]._TerminalGeo.GetComponent(), terminals); } } } } } } return isInsert; } /// /// 寻找可自动相连的端子,并连接 /// /// /// /// private bool AutoItemCon(TerminalCtrl terminal, TerminalModel[][] terminals) { for (int c = 0; c < terminals.GetLength(0); c++) { if (terminals[c] != null) { for (int d = 0; d < terminals[c].Length; d++) { string sameLineID = terminal._CurTerminalData._LinesID[0]; if (TwoTerminalConnectable(terminal, terminals[c][d]._TerminalGeo.GetComponent(), ref sameLineID)) { TerminalsConnect(terminal._CurTerminalData._TerminalGeo.GetComponent(), terminals[c][d]._TerminalGeo.GetComponent(), sameLineID); return true; } } } } return false; } /// /// 两个端子相连 /// _terminalStart不为null,则只能进行几次,否则需要每次为_terminalStart赋值 /// /// /// /// private bool TerminalsConnect(TerminalCtrl a, TerminalCtrl b, string sameLineID) { Debug.Log("线段:" + sameLineID + "——" + a.name + "_连_" + b.name); if (AppManagement.Instance._CurType == EnumCtrl.Type.XHBY || AppManagement.Instance._CurType == EnumCtrl.Type.QDCY) { if (_terminalStart == null) { _chaTouTemp = Instantiate(_chatouPrefab, _chatouContain); _chatou0 = _chaTouTemp.transform.Find("ChaTou0"); a.SetChaTouPos(_chatou0); } a._CurTerminalData._ConnectGeos.Add(b.gameObject); b._CurTerminalData._ConnectGeos.Add(a.gameObject); Transform chatou1 = _chaTouTemp.transform.Find("ChaTou1"); b.SetChaTouPos(chatou1); temp = _chaTouTemp; //生成线段柔化 Transform line = temp.transform.Find("Line"); Transform line2 = temp.transform.Find("Line2"); Transform midPoint = temp.transform.Find("MidPoint"); Transform startPoint = line.GetComponent().point1; Transform endPoint = line2.GetComponent().point2; Vector3 lowPoint; Vector3 highPoint; if (startPoint.position.y > endPoint.position.y) { lowPoint = endPoint.position; highPoint = startPoint.position; } else { lowPoint = startPoint.position; highPoint = endPoint.position; } Debug.Log(Vector3.Distance(lowPoint, highPoint)); if (Vector3.Distance(lowPoint, highPoint) < 1.0f) { midPoint.position = new Vector3( 0.5f * lowPoint.x + (1 - 0.5f) * highPoint.x, 0.5f * lowPoint.y + (1 - 0.5f) * highPoint.y, 0.5f * lowPoint.z + (1 - 0.5f) * highPoint.z ); } else { //位置比例 //小部分在低处 midPoint.position = new Vector3( posx * lowPoint.x + (1 - posx) * highPoint.x, posy * lowPoint.y + (1 - posy) * highPoint.y, posz * lowPoint.z + (1 - posz) * highPoint.z ); //旋转比例 //小部分在高处 //Vector3 rotTargPoint = new Vector3( // rotx * highPoint.x + (1 - rotx) * highPoint.x, // roty * lowPoint.y + (1 - roty) * highPoint.y, // rotz * highPoint.z + (1 - rotz) * highPoint.z // ); } midPoint.LookAt(startPoint, Vector3.up); line.GetComponent().tween = true; line2.GetComponent().tween = true; line.GetComponent().update = true; line2.GetComponent().update = true; float formTime = 0.0f; DOTween.To(() => formTime, x => x = formTime, 0.5f, 0.5f).OnComplete(() => { line.GetComponent().update = false; line2.GetComponent().update = false; }); //line.SetParent(_chatouContain); //line.GetComponent().tween = true; //line.GetComponent().update = true; //float formTime = 0.0f; //DOTween.To(() => formTime, x => x = formTime, 0.5f, 0.5f).OnComplete(() => //{ // line.GetComponent().update = false; //}); //Destroy(_chaTouTemp); } else if (AppManagement.Instance._CurType == EnumCtrl.Type.CLFJ) { if (a != _terminalStart) { a.StraightSetChaTouPos(); } if (b != _terminalStart) { b.StraightSetChaTouPos(); } a._CurTerminalData._ConnectGeos.Add(b.gameObject); b._CurTerminalData._ConnectGeos.Add(a.gameObject); } else if (AppManagement.Instance._CurType == EnumCtrl.Type.ZNYD) { string lineName = sameLineID; if (sameLineID.Equals("22") || sameLineID.Equals("23")) { string terminalStart = a._CurTerminalData._TerminalName; string terminalEnd = b._CurTerminalData._TerminalName; string[] temp = new string[] { "ET2", "ET3", "WLSSQ", "CXKG" }; for (int i = 0; i < temp.Length; i++) { if (terminalStart.Contains(temp[i])) { lineName = $"{sameLineID}({terminalStart},{terminalEnd})"; break; } if (terminalEnd.Contains(temp[i])) { lineName = $"{sameLineID}({terminalEnd},{terminalStart})"; break; } } } if (!string.IsNullOrEmpty(lineName)) { _ZNYDLines[lineName].SetActive(true); } if (_terminalStart) { DestroyImmediate(_chatou0.gameObject); Destroy(_chaTouTemp); } a._CurTerminalData._ConnectGeos.Add(b.gameObject); b._CurTerminalData._ConnectGeos.Add(a.gameObject); } //搬运输送设置插头模式 else if (AppManagement.Instance._CurType == EnumCtrl.Type.BYSS) { Debug.Log(a.gameObject.name + "!!!!!!!!!!!!!!!!!!"); Debug.Log(b.gameObject.name + "!!!!!!!!!!!!!!!!!!"); a.StraightSetChaTouPos(); b.StraightSetChaTouPos(); a._CurTerminalData._ConnectGeos.Add(b.gameObject); b._CurTerminalData._ConnectGeos.Add(a.gameObject); } SyncTerminalInfo(a); SyncTerminalInfo(b); return true; } /// /// 判断此端子是否在当前系统数据中 /// /// /// private bool TerminalInData(string TerminalName) { bool isInclude = false; for (int i = 0; i < _lineConnectData._TerminalDic[EnumCtrl.GetEnumDescription(AppManagement.Instance._CurType)].Count; i++) { TerminalModel[][] terminals = _lineConnectData._TerminalDic[EnumCtrl.GetEnumDescription(AppManagement.Instance._CurType)][i]; for (int a = 0; a < terminals.GetLength(0); a++) { if (terminals[a] != null) { for (int b = 0; b < terminals[a].Length; b++) { if (terminals[a][b]._TerminalGeo.name.Equals(TerminalName)) { isInclude = true; break; } } } } } return isInclude; } /// /// 两个端子必须满足所有条件,才可以相连 /// /// /// /// /// private bool TwoTerminalConnectable(TerminalCtrl a, TerminalCtrl b, ref string sameLineID) { if (!b._CurTerminalData._TerminalName.Equals(a._CurTerminalData._TerminalName) &&//不能连自身 !b._CurTerminalData._ConnectGeos.Contains(a._CurTerminalData._TerminalGeo))//连过的不连 { //是否有相同LineID bool sameline = TerminalsSameLine(a, b._CurTerminalData._TerminalGeo.GetComponent(), out List sameLines); if (sameline) { sameLineID = sameLines[0];//同一模块端子之间和不同模块之间不存在并联,所以只会有一个相同的 ////不要链接为一个环 //bool isLoop = CheckTerminalLoop(a, b._CurTerminalData._TerminalGeo.GetComponent(), sameLineID); //if (!isLoop) //{ ////两个控制面板只允许有一条线 //bool ctrlTwo = CtrlConnect(a, b._CurTerminalData._TerminalGeo.GetComponent(), sameLineID); //if (ctrlTwo) //{ //一个控制板内必须串联 bool bunchInCtrl = BunchInCtrl(a, b._CurTerminalData._TerminalGeo.GetComponent(), sameLineID); if (bunchInCtrl) { return true; } // } // } } } return false; } /// /// 两个端子是否属于同一条线 /// /// /// /// private bool TerminalsSameLine(TerminalCtrl a, TerminalCtrl b, out List sameLinesID) { bool sameLine = false; sameLinesID = new List(); for (int i = 0; i < a._CurTerminalData._LinesID.Count; i++) { for (int j = 0; j < b._CurTerminalData._LinesID.Count; j++) { if (a._CurTerminalData._LinesID[i].Equals(b._CurTerminalData._LinesID[j])) {//判断是否有相同的LineID sameLine = true; sameLinesID.Add(a._CurTerminalData._LinesID[i]); } } } return sameLine; } /// /// 是否形成环 /// /// /// /// 形成环 private bool CheckTerminalLoop(TerminalCtrl a, TerminalCtrl b, string sameLineID) { bool isLoop = TerminalConnectChildren(a, null, b, sameLineID); return isLoop; } /// /// DFS遍历某个端子的所有子物体,查看是否形成环形 /// /// 需要遍历的端子 /// 遍历当前端子时的上一个端子,防止出现重复遍历 /// 需要匹配的目标端子 /// 需要查询的线段ID /// 遍历到和目标相同端子,说明会形成环形,则返回false, private bool TerminalConnectChildren(TerminalCtrl a, TerminalCtrl previous, TerminalCtrl target, string lineID) { bool loop = false; if (a == target) { return true; } if (a._CurTerminalData._ConnectGeos.Count > 0) { foreach (GameObject item in a._CurTerminalData._ConnectGeos) { if (item.GetComponent()._CurTerminalData._LinesID.Contains(lineID)) { if (previous == null || (previous != null && item != previous.gameObject)) { loop = TerminalConnectChildren(item.GetComponent(), a, target, lineID); if (loop) return true; } } } } return loop; } /// /// 两个端子相连,查看是否属于两个控制板, /// 两个控制板的只允许有一条连接线 /// /// /// /// 两个点可连接 private bool CtrlConnect(TerminalCtrl a, TerminalCtrl b, string sameLineID) { bool isConnect = false; string aCtrlName = a._CurTerminalData._CtrlBoard; string bCtrlName = b._CurTerminalData._CtrlBoard; if (aCtrlName.Equals(bCtrlName)) return true;//同一控制板可以直接通过此处 //不同控制板时候,需要有一个控制板没连过线 if (_lineCtrlDic[sameLineID].Contains(aCtrlName) || _lineCtrlDic[sameLineID].Contains(bCtrlName)) { for (int i = 0; i < _lineCtrlDic[sameLineID].Count; i++) { if (aCtrlName.Equals(_lineCtrlDic[sameLineID][i])) { _lineCtrlDic[sameLineID].RemoveAt(i); isConnect = true; i--; } if (i >= 0 && bCtrlName.Equals(_lineCtrlDic[sameLineID][i])) { _lineCtrlDic[sameLineID].RemoveAt(i); isConnect = true; i--; } } } return isConnect; } /// /// 每个线段有多少控制板数据存储起来 /// private void GetCtrlTerminals() { for (int i = 0; i < _lineConnectData._TerminalDic[EnumCtrl.GetEnumDescription(AppManagement.Instance._CurType)].Count; i++) { TerminalModel[][] terminals = _lineConnectData._TerminalDic[EnumCtrl.GetEnumDescription(AppManagement.Instance._CurType)][i]; List ctrls = new List(); for (int a = 0; a < terminals.GetLength(0); a++) { if (terminals[a] != null) { ctrls.Add(terminals[a][0]._CtrlBoard); } } if (!_lineCtrlDic.ContainsKey((i + 1).ToString())) { _lineCtrlDic.Add((i + 1).ToString(), ctrls); } } } /// /// 保证一个控制板内所有端子是串联 /// /// /// /// 两个端子可连 private bool BunchInCtrl(TerminalCtrl aTerminal, TerminalCtrl bTerminal, string sameLineID) { int terminalConNumber = 0;//两个端子都需要验证 foreach (GameObject item in aTerminal._CurTerminalData._ConnectGeos) { if (aTerminal._CurTerminalData._CtrlBoard.Equals(bTerminal._CurTerminalData._CtrlBoard) &&//准备相连的两个属于同一个控制器 aTerminal._CurTerminalData._CtrlBoard.Equals(item.GetComponent()._CurTerminalData._CtrlBoard) &&//验证端子所连接的为同一个控制板的才计入其中 item.GetComponent()._CurTerminalData._LinesID.Contains(sameLineID))//验证端子所连接的同时也是同一条线段的才计入其中 { terminalConNumber++; } } if (terminalConNumber < 2) { terminalConNumber = 0; foreach (GameObject item in bTerminal._CurTerminalData._ConnectGeos) { if (bTerminal._CurTerminalData._CtrlBoard.Equals(aTerminal._CurTerminalData._CtrlBoard) &&//准备相连的两个属于同一个控制器 bTerminal._CurTerminalData._CtrlBoard.Equals(item.GetComponent()._CurTerminalData._CtrlBoard) &&//验证端子所连接的为同一个控制板的才计入其中 item.GetComponent()._CurTerminalData._LinesID.Contains(sameLineID))//验证端子所连接的同时也是同一条线段的才计入其中 { terminalConNumber++; } } } if (terminalConNumber < 2) {//如果存在相同线路端子数量都小于2的就可以连接,多余2的端子说明存在串联 return true; } return false; } /// /// 同步端子信息,防止有的端子在不同线段中,信息无法同步问题 /// private void SyncTerminalInfo(TerminalCtrl terminal) { Dictionary terminalLineDic = new Dictionary(); for (int i = 0; i < _lineConnectData._TerminalDic[EnumCtrl.GetEnumDescription(AppManagement.Instance._CurType)].Count; i++) { TerminalModel[][] terminals = _lineConnectData._TerminalDic[EnumCtrl.GetEnumDescription(AppManagement.Instance._CurType)][i]; for (int a = 0; a < terminals.GetLength(0); a++) { if (terminals[a] != null) { for (int b = 0; b < terminals[a].Length; b++) { if (terminals[a][b]._TerminalGeo.GetComponent() == terminal) { terminals[a][b] = terminal._CurTerminalData; } } } } } } /// /// 检查所有端子是否都连接完毕 /// private void CheckAllTerminalConnect() { //判断每个端子有多少线段 Dictionary terminalLineDic = new Dictionary(); for (int i = 0; i < _lineConnectData._TerminalDic[EnumCtrl.GetEnumDescription(AppManagement.Instance._CurType)].Count; i++) { TerminalModel[][] terminals = _lineConnectData._TerminalDic[EnumCtrl.GetEnumDescription(AppManagement.Instance._CurType)][i]; for (int a = 0; a < terminals.GetLength(0); a++) { if (terminals[a] != null) { for (int b = 0; b < terminals[a].Length; b++) { //考虑到一个端子可能涉及多条线路 if (terminalLineDic.ContainsKey(terminals[a][b]._TerminalGeo.GetComponent())) { terminalLineDic[terminals[a][b]._TerminalGeo.GetComponent()]++; } else { terminalLineDic.Add(terminals[a][b]._TerminalGeo.GetComponent(), 0); } } } } } //连接后判断是否所有线路都链接完成 bool allConnect = true; foreach (var item in terminalLineDic) { if (AppManagement.Instance._CurType == EnumCtrl.Type.CLFJ) { if (item.Key._CurTerminalData._ConnectGeos.Count <= 0) { allConnect = false; break; } } else { if (item.Key._CurTerminalData._ConnectGeos.Count <= item.Value) { allConnect = false; break; } } } if (allConnect) { PopUpMng.PopCustomSucToast("提示", "恭喜您成功完成设备所有接线", "程序调试", () => { CalculateScore(); AppManagement.Instance.ChangeModel(EnumCtrl.Model.Debug); //音频设置 PracticeAndExamInSceneCtrl _practiceAndExamCtrl = UI_Manage.Instance.GetPanel("PracticeAndExamPanel") .GetComponent()._CurTrainExamSceneCtrl; //关闭声音组件 _practiceAndExamCtrl.speakManager.ChangeModelAudio("程序调试"); _practiceAndExamCtrl.speakManager.Init(); }); } } /// /// 计算得分 /// 根据此线段总累计单位数是否等于此线段端子数量减一 /// private void CalculateScore() { //计算得分 for (int i = 0; i < _lineConnectData._TerminalDic[EnumCtrl.GetEnumDescription(AppManagement.Instance._CurType)].Count; i++) { int terminalInLine = 0; TerminalModel[][] terminals = _lineConnectData._TerminalDic[EnumCtrl.GetEnumDescription(AppManagement.Instance._CurType)][i]; for (int a = 0; a < terminals.GetLength(0); a++) { if (terminals[a] != null) { if (AppManagement.Instance._CurType == EnumCtrl.Type.CLFJ) { if (terminals[a][0]._TerminalName.Equals("DLB0.3") || terminals[a][0]._TerminalName.Equals("DLB0.4") || terminals[a][0]._TerminalName.Equals("DLB0.5")) { terminalInLine += 2; } else { terminalInLine += terminals[a].Length; } } else { terminalInLine += terminals[a].Length; } } } if (_connectLineDic.ContainsKey((i + 1).ToString())) { if (_connectLineDic[(i + 1).ToString()] == terminalInLine - 1) {//得分=此线段端子数量-1 AppManagement.Instance._ConnectScore += 3; } } } } /// /// 此线段每次接通一个小线段,累加一个单位 /// /// private void AddScore(string lineID) { if (!string.IsNullOrEmpty(lineID)) { if (_connectLineDic.ContainsKey(lineID)) { _connectLineDic[lineID]++; } else { _connectLineDic.Add(lineID, 1); } } } } }