loudixvmuniu/Assets/_Scripts/Application/UI/OperationStepPanel.cs
2025-01-02 12:15:45 +08:00

529 lines
25 KiB
C#

using CG.Framework;
using CG.UTility;
using DG.Tweening;
using KinematicCharacterController;
using KinematicCharacterController.Examples;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
/*******************************************************************************
*Create By CG
*Function
*******************************************************************************/
namespace ZXK.LouDiXvMuNiu
{
public class OperationStepPanel : UIBase
{
protected Transform _stepContent = null;
protected GameObject _stepBigItemPrefab = null;
protected GameObject _stepSmallItemPrefab = null;
private List<GameObject> _stepBigs = new List<GameObject>();
private List<GameObject> _stepChildrens = new List<GameObject>();
protected const float _smallItemSizeY = 25.0f;//每个子项大小
protected const float _smallItemIntervalY = 5.0f;//每个子项之间间隔
protected const float _smallParentInitPosY = -40.0f;//子项父物体初始位置
private const float _openCloseAnmSpeed = 0.01f;//开合动画播放速度控制
private GameObject _introduceGeo = null;
private Text _trainExplainTxt = null;
private Button _nextBtn = null;
private Toggle _defaultCameraTRTog = null;
private Toggle _nearCameraTRTog = null;
protected override void Awake()
{
base.Awake();
_stepContent = GetWedage("StepContent_N").transform;
_stepBigItemPrefab = GetWedage("StepBigItemPrefab_N");
_stepSmallItemPrefab = GetWedage("StepSmallItemPrefab_N");
_introduceGeo = GetWedage("introduce_N");
_trainExplainTxt = GetWedage("TrainExplain_N").GetComponent<Text>();
_nextBtn = GetWedage("NextBtn_N").GetComponent<Button>();
_defaultCameraTRTog = GetWedage("DefaultTR_N").GetComponent<Toggle>();
_nearCameraTRTog = GetWedage("NearTR_N").GetComponent<Toggle>();
List<NiuData> dataSrc = GameManager.Instance._DataNiuHandler.NiuStepTypeDic[GameManager.Instance._CurModelType];
List<string[]> dataTemp = new List<string[]>();
for (int i = 0; i < dataSrc.Count; i++)
{
string[] msg = new string[4] { dataSrc[i].id.ToString(), dataSrc[i].TaskName, dataSrc[i].ThreeTaskName, dataSrc[i].TaskType };
dataTemp.Add(msg);
}
//TODO 临时内容
switch (GameManager.Instance._CurModelType)
{
case ConstCtrl.ModuleName_TQFAQCL:
case ConstCtrl.ModuleName_CSPLCL:
case ConstCtrl.ModuleName_RGSJ:
case ConstCtrl.ModuleName_CP:
case ConstCtrl.ModuleName_PTYZ:
case ConstCtrl.ModuleName_YYZD:
ChangeCameraPos(new Vector3(2.2f, -1.19f, -2.24f), new Vector3(18.474f, -38.834f, 0));
break;
case ConstCtrl.ModuleName_PTXZ:
case ConstCtrl.ModuleName_JZLVJC:
ChangeCameraPos(new Vector3(1.071f, -2.406f, 39.0302f), new Vector3(7.35f, 0, 0));
break;
}
_defaultCameraTRTog.onValueChanged.AddListener((isOn) =>
{
if (isOn)
{
NiuData curStep = GameManager.Instance._DataNiuHandler.CurNiuHandler.Value;
CameraSetDefaultTR(curStep);
}
});
_nearCameraTRTog.onValueChanged.AddListener((isOn) =>
{
if (isOn)
{
}
});
_defaultCameraTRTog.isOn = _nearCameraTRTog.isOn = false;
InitStepSecondMenuDataUI(dataTemp);
GameManager.Instance._DataNiuHandler.CurNiuHandler.OnValueChanged += OnValueChanged;
}
protected override void OnDestroy()
{
base.OnDestroy();
GameManager.Instance._DataNiuHandler.CurNiuHandler.OnValueChanged -= OnValueChanged;
WDebug.Log("解绑");
}
/// <summary>
/// 实例化数据到流程栏(带有二级菜单功能)
/// </summary>
/// <param name="partsInfo">[id,TaskName,ThreeTaskName,TaskType]</param>
private void InitStepSecondMenuDataUI(List<string[]> partsInfo)
{
string bigStep = "";
int bigStepIndex = 0;
float extensionTxt = 0;
RectTransform smallParent = null;
RectTransform stepBigRect = null;
foreach (string[] item in partsInfo)
{
if (item[3].Equals(ConstCtrl.TASKTYPE_Tran)
|| item[3].Equals(ConstCtrl.TASKTYPE_Finish)
|| item[3].Equals(ConstCtrl.TASKTYPE_VideoAuto)) continue;
if (!item[1].Equals(bigStep))
{
bigStepIndex++;
GameObject stepBigGeo = Instantiate(_stepBigItemPrefab, _stepContent);
stepBigRect = stepBigGeo.GetComponent<RectTransform>();
smallParent = stepBigGeo.transform.Find("StepSmallParent").GetComponent<RectTransform>();
stepBigGeo.name = /*curShowGeo + "_" + */item[1];
stepBigGeo.transform.Find("IsSelectBG/TextDetail").GetComponent<Text>().text = item[1];
_stepBigs.Add(stepBigGeo);
Button bigBtn = stepBigGeo.transform.Find("BigBtnTri").GetComponent<Button>();
#if !UNITY_EDITOR
if (GameManager.Instance._StateContext.GetState().Name.Equals("ExamState"))
{
bigBtn.interactable = false;
}
#endif
bigBtn.onClick.AddListener(() =>
{//点击大步骤,直接选择对应第一个小步骤
Toggle smallStepTog = bigBtn.transform.parent.Find("StepSmallParent").GetChild(1).GetComponent<Toggle>();
smallStepTog.isOn = true;
SelectBigStepGeo(bigBtn.transform.parent);
});
Toggle bigOpenClose = stepBigGeo.transform.Find("OpenCloseBtn").GetComponent<Toggle>();
#if !UNITY_EDITOR
if (GameManager.Instance._StateContext.GetState().Name.Equals("ExamState"))
{
bigOpenClose.interactable = false;
}
#endif
bigOpenClose.GetComponent<Toggle>().onValueChanged.AddListener((isOn) =>
{
OnClickBigStep(bigOpenClose.transform.parent.GetComponent<RectTransform>(), !isOn);
});
bigOpenClose.isOn = _stepBigs.Count == 1;
bigStep = item[1];
stepBigGeo.SetActive(true);
extensionTxt = 0;
}
if (_stepChildrens.Count > 1)
{
string previousStepThreeTaskName = _stepChildrens[_stepChildrens.Count - 1].transform.Find("TextContent").GetComponent<Text>().text;
if (item[2] == previousStepThreeTaskName) continue;
}
GameObject stepSmallGeo = Instantiate(_stepSmallItemPrefab, smallParent.transform);
stepSmallGeo.name = item[0];
string contentStr = item[2];
stepSmallGeo.transform.Find("TextContent").GetComponent<Text>().text = contentStr;
Toggle smallTog = stepSmallGeo.GetComponent<Toggle>();
#if !UNITY_EDITOR
if (GameManager.Instance._StateContext.GetState().Name.Equals("ExamState"))
{
smallTog.interactable = false;
}
#endif
smallTog.group = stepSmallGeo.transform.parent.GetComponent<ToggleGroup>();
smallTog.onValueChanged.AddListener((isOn) =>
{
List<NiuData> tempData = GameManager.Instance._DataNiuHandler.NiuStepTypeDic[GameManager.Instance._CurModelType];
for (int i = 0; i < tempData.Count; i++)
{
if (tempData[i].id.ToString().Equals(smallTog.transform.name))
{
GameManager.Instance._DataNiuHandler.CurNiuHandler.Value = tempData[i];
break;
}
}
});
RectTransform stepSmallRectTran = stepSmallGeo.GetComponent<RectTransform>();
int smallNumber = smallParent.childCount - 2;//多减掉一个隐藏的预制体
stepSmallRectTran.anchoredPosition = new Vector2(stepSmallRectTran.anchoredPosition.x, -(_smallItemSizeY + _smallItemIntervalY) * smallNumber - extensionTxt);
//if (CG.UTility.UtilitiesMng.GetTransCharNum(contentStr) > 25)
//{
// extensionTxt += _smallItemSizeY;
// stepSmallRectTran.sizeDelta = new Vector2(stepSmallRectTran.sizeDelta.x, _smallItemSizeY + _smallItemSizeY);
//}
stepBigRect.sizeDelta = new Vector2(stepBigRect.sizeDelta.x, -_smallParentInitPosY - _smallItemIntervalY + _smallItemSizeY + (_smallItemSizeY + _smallItemIntervalY) * smallNumber + extensionTxt);
smallParent.sizeDelta = new Vector2(smallParent.sizeDelta.x, _smallItemSizeY + (_smallItemSizeY + _smallItemIntervalY) * smallNumber + extensionTxt);
stepSmallGeo.SetActive(true);
_stepChildrens.Add(stepSmallGeo);
}
}
private void OnValueChanged(NiuData obj)
{
if (obj.TaskName != GameManager.Instance._DataNiuHandler.CurNiuHandler.PreviousValue.TaskName)
{//前后任务名字不同
NiuSceneMng._Instance.InitPlayAnmState(obj, GameManager.Instance._DataNiuHandler.CurNiuHandler.PreviousValue);
}
else if(obj.ThreeTaskName != GameManager.Instance._DataNiuHandler.CurNiuHandler.PreviousValue.ThreeTaskName)
{//前后三级人物名字不同
_defaultCameraTRTog.isOn = true;
//考核模式下,在物品选择之前,物品需要隐藏
if (GameManager.Instance._StateContext.GetState().Name.Equals("ExamState"))
{
int geoShowID = 0;
foreach (NiuData item in GameManager.Instance._DataNiuHandler.NiuStepTypeDic[GameManager.Instance._CurModelType])
{
if (item.TaskType.Equals(ConstCtrl.TASKTYPE_ShowGeo))
{
geoShowID = item.id;
}
}
NiuSceneMng._Instance.UseToolsActive(obj.id > geoShowID);
}
}
UpdateTaskType(obj);
UpdateSelectItem(obj);
WordExplain(obj);
//此处判断是否显示工具箱
if (!GameManager.Instance._IsTrain&&
obj.TaskType.Equals(ConstCtrl.TASKTYPE_ShowGeo))
{
UI_Manage.Instance.ShowPanel("SelectToolsPanel", Type.GetType("ZXK.LouDiXvMuNiu.SelectToolsPanel"), UIGroup.Main);
}
else
{
UI_Manage.Instance.HidePanel("SelectToolsPanel");
}
}
/// <summary>
/// 实时跟新选择选项对应的样式信息
/// </summary>
/// <param name="obj"></param>
private void UpdateSelectItem(NiuData obj)
{
//找到选项所在的三级子任务当中的第一项作为高亮选项
NiuData objLight = null;
List<NiuData> threeTasks = GameManager.Instance._DataNiuHandler.NiuStepTypeDic[GameManager.Instance._CurModelType];
for (int i = 0; i < threeTasks.Count; i++)
{
if (threeTasks[i].ThreeTaskName == obj.ThreeTaskName)
{
objLight = threeTasks[i];
break;
}
}
//选项自身变化
Transform seleTran = null;
for (int i = 0; i < _stepChildrens.Count; i++)
{
_stepChildrens[i].GetComponent<Toggle>().isOn = false;
_stepChildrens[i].transform.Find("TextContent").GetComponent<Text>().color = Color.white;
if (_stepChildrens[i].name.Equals(objLight.id.ToString()))
{
seleTran = _stepChildrens[i].transform;
}
}
Text nameTxt = seleTran.Find("TextContent").GetComponent<Text>();
nameTxt.color = Color.blue;
//根据子选项Transform找到大步骤选项变化
for (int i = 0; i < _stepBigs.Count; i++)
{
_stepBigs[i].transform.Find("IsSelectBG/TextDetail").GetComponent<Text>().color = Color.white;
_stepBigs[i].transform.Find("IsSelectBG/TextDetail").GetComponent<Outline>().effectColor = new Color(Color.white.r, Color.white.g, Color.white.b, 0.2f);
_stepBigs[i].transform.Find("IsNoSelectLogo/IsSelectLogoLINE").gameObject.SetActive(false);
}
SelectBigStepGeo(seleTran.parent.parent);
}
/// <summary>
/// 根据任务不同类型进行处理每个步骤
/// </summary>
/// <param name="obj"></param>
private void UpdateTaskType(NiuData obj)
{
if (obj.TaskType.Equals(ConstCtrl.TASKTYPE_Video))
{
if (GameManager.Instance._StateContext.GetState().Name.Equals("TrainState"))
{
List<GameObject> tempToolArray = NiuSceneMng._Instance.GetNeedClickTools(obj);
NiuSceneMng._Instance.OnlyShowBTGeo(tempToolArray.ToArray());
}
else if (GameManager.Instance._StateContext.GetState().Name.Equals("ExamState"))
{
GameObject videoGeo = UI_Manage.Instance.ShowPanel("VideoShowPanel", Type.GetType("ZXK.LouDiXvMuNiu.VideoShowPanel"), UIGroup.Tip);
videoGeo.GetComponent<VideoShowPanel>().PlayVideoClip(obj.VideoPath, () =>
{
GameManager.Instance._DataNiuHandler.CurNiuHandler.Value = GameManager.Instance._DataNiuHandler.GetNextStep(obj.QNextNum);
});
}
}
if (obj.TaskType.Equals(ConstCtrl.TASKTYPE_VideoAuto))
{
GameObject videoGeo = UI_Manage.Instance.ShowPanel("VideoShowPanel", Type.GetType("ZXK.LouDiXvMuNiu.VideoShowPanel"), UIGroup.Tip);
videoGeo.GetComponent<VideoShowPanel>().PlayVideoClip(obj.VideoPath, () =>
{
GameManager.Instance._DataNiuHandler.CurNiuHandler.Value = GameManager.Instance._DataNiuHandler.GetNextStep();
});
}
if (obj.TaskType.Equals(ConstCtrl.TASKTYPE_Tran))
{
if (GameManager.Instance._StateContext.GetState().Name.Equals("TrainState"))
{
NiuSceneMng._Instance.TimeTranInStep(obj);
}
else if (GameManager.Instance._StateContext.GetState().Name.Equals("ExamState"))
{
if (string.IsNullOrEmpty(obj.Question))
{
NiuSceneMng._Instance.TimeTranInStep(obj);
}
else
{
NiuSceneMng._Instance.AnswerSystemInStep(obj);
}
}
}
if (obj.TaskType.Equals(ConstCtrl.TASKTYPE_TranAnim))
{
NiuSceneMng._Instance.TimeTranAnmInStep(obj);
}
if (obj.TaskType.Equals(ConstCtrl.TASKTYPE_Finish))
{
PopUpMng.PopAlert("提示", "当前模块已完成", "确认", null);
}
}
/// <summary>
/// 点击大步骤,控制大步骤展开合并
/// </summary>
/// <param name="stepBigRect"></param>
private void OnClickBigStep(RectTransform stepBigRect,bool isClose)
{
RectTransform smallItemParent = stepBigRect.transform.Find("StepSmallParent").GetComponent<RectTransform>();
if (isClose)
{//处于展开状态
//关闭动画
//DOTween.Kill("OpenSequence");
Sequence closeSequence = DOTween.Sequence();
closeSequence.Append(stepBigRect.DOSizeDelta(new Vector2(stepBigRect.sizeDelta.x, -_smallParentInitPosY - _smallItemIntervalY), _openCloseAnmSpeed * smallItemParent.childCount));
closeSequence.Insert(0, stepBigRect.Find("OpenCloseBtn").DORotate(Vector3.forward * 0.0f, _openCloseAnmSpeed * smallItemParent.childCount));
closeSequence.Insert(0, smallItemParent.DOSizeDelta(new Vector2(smallItemParent.sizeDelta.x, 0), _openCloseAnmSpeed * smallItemParent.childCount));
for (int i = 0; i < smallItemParent.GetComponentsInChildren<Button>().Length; i++)
{
RectTransform item = smallItemParent.GetComponentsInChildren<Button>()[i].GetComponent<RectTransform>();
closeSequence.Insert(0, item.DOAnchorPosY(0, _openCloseAnmSpeed * (i + 1)));
}
closeSequence.Insert(0, smallItemParent.DOAnchorPosY(0, _openCloseAnmSpeed * smallItemParent.childCount)).OnComplete(() =>
{
smallItemParent.gameObject.SetActive(false);
}).SetId("CloseSequence");
}
else
{//处于合并状态
//展开动画
//DOTween.Kill("CloseSequence");
Sequence openSequence = DOTween.Sequence();
float smallItemParentSizeY = _smallItemSizeY + (_smallItemSizeY + _smallItemIntervalY) * (smallItemParent.childCount - 2);//多减掉一个隐藏的预制体
openSequence.Append(stepBigRect.DOSizeDelta(new Vector2(stepBigRect.sizeDelta.x, -_smallParentInitPosY - _smallItemIntervalY + smallItemParentSizeY), _openCloseAnmSpeed * smallItemParent.childCount));
openSequence.Insert(0, stepBigRect.Find("OpenCloseBtn").DORotate(Vector3.forward * -90.0f, _openCloseAnmSpeed * smallItemParent.childCount));
openSequence.Insert(0, smallItemParent.DOSizeDelta(new Vector2(smallItemParent.sizeDelta.x, smallItemParentSizeY), _openCloseAnmSpeed * smallItemParent.childCount));
for (int i = 0; i < smallItemParent.GetComponentsInChildren<Button>().Length; i++)
{
RectTransform item = smallItemParent.GetComponentsInChildren<Button>()[i].GetComponent<RectTransform>();
openSequence.Insert(0, item.DOAnchorPosY(-(_smallItemSizeY + _smallItemIntervalY) * i, _openCloseAnmSpeed * (i + 1)));
}
openSequence.Insert(0, smallItemParent.DOAnchorPosY(_smallParentInitPosY, _openCloseAnmSpeed * smallItemParent.childCount)).OnStart(() =>
{
smallItemParent.gameObject.SetActive(true);
}).SetId("OpenSequence");
}
}
/// <summary>
/// 选择对应的大步骤
/// </summary>
/// <param name="seleTran">代表大步骤物体</param>
private void SelectBigStepGeo(Transform bigBtnTran)
{
Toggle bigOpenClose = bigBtnTran.Find("OpenCloseBtn").GetComponent<Toggle>();
bigOpenClose.isOn = true;
Transform itemTxt = bigBtnTran.Find("IsSelectBG/TextDetail");
itemTxt.GetComponent<Text>().color = Color.blue;
itemTxt.GetComponent<Outline>().effectColor = new Color(Color.blue.r, Color.blue.g, Color.blue.b, 0.2f);
bigBtnTran.Find("IsNoSelectLogo/IsSelectLogoLINE").gameObject.SetActive(true);
}
/// <summary>
/// 文字说明界面
/// </summary>
private void WordExplain(NiuData obj)
{
if (obj.TaskType.Equals(ConstCtrl.TASKTYPE_WordExp))
{
UI_Manage.Instance.ClosePanel("ShowToastUIPrefab");
_introduceGeo.SetActive(true);
_trainExplainTxt.text = obj.ProcessDescription;
if (!string.IsNullOrEmpty(obj.SoundPath))
{
string audioPath = Application.streamingAssetsPath + "/Audios/NiuTips/" + obj.SoundPath + ".mp3";
CG.UTility.UtilitiesMng.LoadAudio(audioPath, (AudioClip clip) =>
{
if (clip)
{
_trainExplainTxt.GetComponent<AudioSource>().clip = clip;
_trainExplainTxt.GetComponent<AudioSource>().Play();
}
});
}
_nextBtn.GetComponent<RectTransform>().anchoredPosition = new Vector2(1.3f, 388.3f);
}
else if (obj.TaskType.Equals(ConstCtrl.TASKTYPE_ShowGeo))
{
_introduceGeo.SetActive(false);
if (GameManager.Instance._StateContext.GetState().Name.Equals("TrainState"))
{
PopUpMng.PopAddAudToast(obj.ProcessDescription, obj.SoundPath, -1, UIGroup.Tip);
}
else if (GameManager.Instance._StateContext.GetState().Name.Equals("ExamState"))
{
PopUpMng.PopToast(obj.ExamTip, -1, UIGroup.Tip);
}
_nextBtn.GetComponent<RectTransform>().anchoredPosition = new Vector2(890.0f, 966.0f);
}
else if (obj.TaskType.Equals(ConstCtrl.TASKTYPE_Anim))
{
_introduceGeo.SetActive(false);
if (GameManager.Instance._StateContext.GetState().Name.Equals("TrainState"))
{
if (string.IsNullOrEmpty(obj.ProcessDescription))
{
UI_Manage.Instance.HidePanel("ShowToastUIPrefab");
}
else
{
PopUpMng.PopAddAudToast(obj.ProcessDescription, obj.SoundPath, -1, UIGroup.Tip);
}
}
else if (GameManager.Instance._StateContext.GetState().Name.Equals("ExamState"))
{
if (string.IsNullOrEmpty(obj.ExamTip))
{
UI_Manage.Instance.HidePanel("ShowToastUIPrefab");
}
else
{
PopUpMng.PopToast(obj.ExamTip, -1, UIGroup.Tip);
}
}
_nextBtn.GetComponent<RectTransform>().anchoredPosition = new Vector2(890.0f, 966.0f);
}
_nextBtn.onClick.RemoveAllListeners();
_nextBtn.onClick.AddListener(() =>
{
if (NiuSceneMng._Instance._IsPlayAnm) return;
GameManager.Instance._DataNiuHandler.CurNiuHandler.Value = GameManager.Instance._DataNiuHandler.GetNextStep();
});
}
/// <summary>
/// 手动摄像机则按钮变为false
/// </summary>
public void SetCameraTRTogFalse()
{
_defaultCameraTRTog.isOn = _nearCameraTRTog.isOn = false;
}
/// <summary>
/// 设置摄像机为近距离视角
/// </summary>
private void CameraSetNearTR()
{
}
/// <summary>
/// 设置摄像机为默认视角
/// </summary>
/// <param name="obj"></param>
private void CameraSetDefaultTR(NiuData obj)
{
if (string.IsNullOrEmpty(obj.CameraDefaultTR)) return;
try
{
string[] cameraDefaultTR = obj.CameraDefaultTR.Split("|");
string[] camDefPosStr = cameraDefaultTR[0].Split("_");
string[] camDefRotStr = cameraDefaultTR[1].Split("_");
Vector3 cameraDefPos = new Vector3(float.Parse(camDefPosStr[0]), float.Parse(camDefPosStr[1]), float.Parse(camDefPosStr[2]));
Vector3 cameraDefRot = new Vector3(float.Parse(camDefRotStr[0]), float.Parse(camDefRotStr[1]), float.Parse(camDefRotStr[2]));
ChangeCameraPos(cameraDefPos, cameraDefRot);
}
catch (Exception ex)
{
WDebug.LogError($"数据出现错误:{ex.Message}");
return;
}
}
/// <summary>
/// 调整场景摄像机位置
/// </summary>
/// <param name="pos"></param>
/// <param name="rot"></param>
private void ChangeCameraPos(Vector3 pos, Vector3 rot)
{
KinematicCharacterMotor kinematic = Camera.main.GetComponent<CameraControl>()._CameraCtrl.transform.GetComponent<KinematicCharacterMotor>();
ExampleCharacterCamera characterCamera = Camera.main.GetComponent<ExampleCharacterCamera>();
///设置人偶物体旋转,位置
kinematic.SetPositionAndRotation(pos, Quaternion.Euler(0, rot.y, 0));///设置相机旋转,位置
characterCamera.transform.rotation = Quaternion.Euler(rot.x, rot.y, 0);
characterCamera.transform.position = characterCamera.pos.transform.position;
}
}
}