2025-02-12 08:43:33 +08:00

598 lines
27 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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<string> _curNeedTools = new List<string>();
//选择的工具不是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<ItemModelCtrl>();
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);
}
/// <summary>
/// 从总数居中获取工具
/// </summary>
private void GetTools()
{
List<string> tools = new List<string>();
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<ToolsPanel>();
Transform toosTran = toolsUI.GetComponent<Transform>();
toosTran.SetAsFirstSibling();
toosCtrl.Init(tools.ToArray());
}
/// <summary>
/// 获取当前步骤需要的工具集合
/// </summary>
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]);
}
}
/// <summary>
/// 鼠标在工具图标上按下
/// </summary>
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();
}
});
}
}
/// <summary>
/// 赋值当前进行到第几步
/// </summary>
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<string, DataItemModel> 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<Collider>().enabled = false;
}
if (_CurTrainExamSceneCtrl._partModel[i].name.Equals("SM_HuaKuai"))
{
Transform HuaKuaiTran = _CurTrainExamSceneCtrl._partModel[i].transform;
_CurTrainExamSceneCtrl.GetComponentInChildren<Animator>().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<Collider>().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<Collider>().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<Collider>().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<Collider>().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<Animator>().enabled = true;
WDebug.Log("滑块规整");
});
}
}
}
}
}
}
}
}
_packageNumber = 0;
PopUpMng.PopAlert(_CurProcess.Hint, -1);
}
/// <summary>
/// 组装错误的时候播放自动组装动画
/// </summary>
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);
});
}
}
}