2025-03-10 10:18:11 +08:00

710 lines
30 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 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;//判断是否打开工具箱,控制语音文本生成位置
/// <summary>
/// 判断是否可以自由控制摄像机,
/// 如果允许自由切换摄像机,按键后才允许自由切换,否则并没有自由控制
/// </summary>
private bool _freeCamera = false;
private Transform _curCamera = null;
private Transform _curCameraParent = null;
private Dictionary<string, DataExamModel> _curExamResultData = new Dictionary<string, DataExamModel>();
//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<CameraMyControl>().enabled = _freeCamera;
_curCamera.GetComponent<Cinemachine.CinemachineBrain>().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<MeshRenderer>().material.SetFloat("_Height", 0.0f);
_zaoMaoTrans.GetComponent<MeshRenderer>().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");
}
/// <summary>
/// 摄像机是否可控,是否处于闲置状态
/// </summary>
/// <param name="enter"></param>
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<CameraMyControl>().enabled = free;
_curCamera.GetComponent<Cinemachine.CinemachineBrain>().enabled = !free;
}
/// <summary>
/// 下一步
/// </summary>
public void NextProcess()
{
//GameRoot.Instance._DataUICtrl.NextProcess();
//PopUpMng.PopAlert($"请点击下一个科目{GameRoot.Instance._CurFirstProcess}-{GameRoot.Instance._NextSecondProcess}", 100);
}
/// <summary>
/// 结束当前timeline
/// </summary>
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<ExamBaseCtrl>();
_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<ExamBaseCtrl>();
_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<Cinemachine.CinemachineBrain>().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<string> selectTool)
{
if (selectTool!=null)
{
_curExamBaseCtrl.ToolSubmitBtn(selectTool);
}
return true;
}
#region
/// <summary>
/// 从文件读取数据
/// </summary>
private Dictionary<string, Dictionary<string, Dictionary<string, DataExamModel>>> ReadExamResultData()
{
//string examReslutStr = TxtFileHandle.ReadAllTxt(_filePath);
//string examReslutStr = TxtFileHandle.ReadAllTxtByResource(ConstCtrl.DATA_ExamResult_PATH);
string examReslutStr = TxtFileHandle.ReadAllTxtByPrefs(ConstCtrl.DATA_ExamResult_Key);
Dictionary<string, Dictionary<string, Dictionary<string, DataExamModel>>> dataArray = JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string, Dictionary<string, DataExamModel>>>>(examReslutStr);
if (dataArray == null) dataArray = new Dictionary<string, Dictionary<string, Dictionary<string, DataExamModel>>>();
return dataArray;
}
/// <summary>
/// 将数据写入文件
/// </summary>
private void WriteExamResultData(Dictionary<string, Dictionary<string, Dictionary<string, DataExamModel>>> 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<string, Dictionary<string, Dictionary<string, DataExamModel>>> data = ReadExamResultData();
//整理顺序顺序
Dictionary<string, DataExamModel> tempExamData = new Dictionary<string, DataExamModel>();
List<string> 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<string, Dictionary<string, DataItemModel>> curFirstProcess = new Dictionary<string, Dictionary<string, DataItemModel>>();
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<string, Dictionary<string, DataExamModel>>());
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<string, Dictionary<string, Dictionary<string, DataExamModel>>> data = ReadExamResultData();
_curScoreCtrl.ShowBriefScore(data);
}
/// <summary>
/// 将每个第二工序完成的流程存储到临时变量中
/// </summary>
/// <param name="useTool"></param>
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
}
}