using CG.UTility;
using DG.Tweening;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using UnityEngine;
using ZXK.GYJQR;
using Component = UnityEngine.Component;
///
/// 执行步骤枚举
///
namespace ZXK.GYJQR
{
public enum ExcuteState
{
Excute,//执行当前步骤
Switch,//切换下一个步骤
None
}
///
/// 步骤管理类
///
public class StepManager : Singleton
{
public string CurAZBSState = "";//当前大步骤类型枚举
[HideInInspector]
private Dictionary> stepBigSmallDic = new Dictionary>();
private List azbsBigStepArray = new List();//保存大步骤数据报文的字典
[HideInInspector]
public Step_0 CurStep;//当前执行的小步骤
private Dictionary dictStep;//保存小步骤类的字典
private string saveStepPath = null;//保存步骤类的路径
[HideInInspector]
public AZBS nextAZBS;//下一个大步骤
[HideInInspector]
public float totalScore;//总分值
private void Start()
{
dictStep = new Dictionary();
saveStepPath = "Prefabs/Step";
}
public void Update()
{
CurStep?.StepUpdate();
}
///
/// 执行到步骤的操作
///
public void OnExcuteAZBS(ExcuteState excuteState)
{
DOTween.PauseAll();
switch (excuteState)
{
case ExcuteState.Excute:
CurAZBSState = GameManager.Instance._DataAZBSHandler.CurAZBShandler.Value.stepName;
break;
case ExcuteState.Switch:
CurAZBSState = nextAZBS.stepName;
GameManager.Instance._DataAZBSHandler.CurAZBShandler.Value = nextAZBS;
break;
case ExcuteState.None:
break;
default:
break;
}
OnSwitchAZBS(CurAZBSState);
}
///
/// 切换大步骤函数
///
///
private void OnSwitchAZBS(string state)
{
CreateStep();
//Add By CG 每次切换步骤的时候需要判定当前示教器状态,因为轴向校零的时候示教器状态变动较大
//ModelManager.Instance.InitAllGeo();
ModelManager.Instance.InitZXXLSJQState(false);
switch (state)
{
case ConstCtrl.BigStepName_LJQDDL:
SwitchStep("LJQDDL_Step_1");
break;
case ConstCtrl.BigStepName_LJXHDL:
SwitchStep("LJXHDL_Step_1");
break;
case ConstCtrl.BigStepName_SJQJX:
SwitchStep("SJQJX_Step_1");
break;
case ConstCtrl.BigStepName_LJDYX:
SwitchStep("LJDYX_Step_1");
break;
case ConstCtrl.BigStepName_SBKJ:
SwitchStep("SBKJ_Step_1");
break;
case ConstCtrl.BigStepName_ZXXL:
ModelManager.Instance.InitZXXLSJQState(true);
SwitchStep("ZXXL_Step_1");
break;
default:
break;
}
}
///
/// 创建步骤类到界面中
///
private void CreateStep()
{
stepBigSmallDic.Clear();
dictStep.Clear();
OnReset();
InitData();
InitStep(stepBigSmallDic[CurAZBSState]);
}
///
/// 每一次切换大步骤时对步骤进行重置
///
public void OnReset()
{
CameraControl control = Camera.main.GetComponent();
control.transform.DOKill();
ModelManager.Instance.OnEndCallBack();
//切换大步骤时关闭所有的菜单
AdjustAngleMenu[] angleMenus = FindObjectsOfType();
foreach (var item in angleMenus)
{
item.gameObject.SetActive(false);
}
}
///
/// 初始话结构体列表
///
private void InitData()
{
AZBS curStep = GameManager.Instance._DataAZBSHandler.CurAZBShandler.Value;
CurAZBSState = curStep.stepName;
stepBigSmallDic= GetAZBSDic();
GetNextAZBS(CurAZBSState);
}
///
/// 通过遍历AZBS列表获取到对应的步骤类列表
///
///
private Dictionary> GetAZBSDic()
{
Dictionary> dicAZBSStateStep = new Dictionary>();
List aZBs = GameManager.Instance._DataAZBSHandler.AZBSDataArray;
for (int i = 0; i < aZBs.Count; i++)
{
string aZBSState = aZBs[i].stepName;
if (aZBSState.Equals("OVER")) continue;
string _stepCtrl = aZBs[i].ctrlScriptName;
Type type = Type.GetType("ZXK.GYJQR."+_stepCtrl);
Step_0 instance = Activator.CreateInstance(type, aZBs[i]) as Step_0;
if (dicAZBSStateStep.ContainsKey(aZBSState))
{
dicAZBSStateStep[aZBSState].Add(instance);
}
else
{
List aZBSSteps = new List();
aZBSSteps.Add(instance);
dicAZBSStateStep.Add(aZBSState, aZBSSteps);
}
if (!azbsBigStepArray.Contains(aZBSState))
{
azbsBigStepArray.Add(aZBSState);
}
}
return dicAZBSStateStep;
}
///
/// 大步骤完成后切换到下一个
///
private void GetNextAZBS(string context)
{
string newContext = GetAZBSState(context);
foreach (AZBS item in GameManager.Instance._DataAZBSHandler.AZBSDataArray)
{
string nextState = item.stepName;
if (nextState.Equals(newContext))
{
nextAZBS = item;
}
}
}
///
/// 根据小步骤的名字切换当前的步骤
///
public void SwitchStep(string stepName)
{
Step_0 nextStep = GetStep(stepName);
if (nextStep == null)
{
WDebug.LogError("当前字典中没有寻找到" + nextStep.GetType().Name + "的步骤子类");
}
if (nextStep != null)
{
CurStep = nextStep;
if (GameManager.Instance._EnteredTrainSceneArray.Contains(GameManager.Instance._CurSystemType))
{
CurStep?.StepStart();
PopUpMng.PopAddAudToast(CurStep._ItemAttr.tipText, CurStep._ItemAttr.sound, 0.0f);
}
else
{
StartCoroutine("EnteredPlayAud");
}
}
}
private System.Collections.IEnumerator EnteredPlayAud()
{
yield return new WaitForSeconds(0.5f);
FirstEnterTrainPanel firstGeo = CG.Framework.UI_Manage.Instance.GetPanel("FirstEnterTrainPanel").GetComponent();
firstGeo.EnteredEvent += () =>
{
CurStep?.StepStart();
PopUpMng.PopAddAudToast(CurStep._ItemAttr.tipText, CurStep._ItemAttr.sound, 0.0f);
};
}
///
/// 根据名称获取到对应的步骤
///
///
private Step_0 GetStep(string stepName)
{
if (!dictStep.ContainsKey(stepName))
{
WDebug.LogError("当前字典中没有寻找到" + stepName + "的步骤子类");
}
Step_0 step = null;
dictStep.TryGetValue(stepName, out step);
return step;
}
///
/// 根据唯一标识符获取当前步骤
///
///
public Step_0 GetIdentityStep(string stepIdentity)
{
foreach (var item in dictStep)
{
Step_0 step = item.Value;
if (step._ItemAttr.id.ToString().Equals(stepIdentity))
{
return step;
}
}
WDebug.LogError("当前字典中没有寻找到" + stepIdentity + "的步骤子类");
return null;
}
///
/// 根据唯一标识符切换下一个步骤
///
///
public void SwitchIdentityStep(Step_0 step)
{
for (int i = 0; i < dictStep.Count; i++)
{
var key = dictStep.ElementAt(i);
if (key.Value._ItemAttr.id.Equals(step._ItemAttr.id))
{
var newValue = dictStep.ElementAt(i + 1).Value;
WDebug.Log("下一个小步骤的名称为" + newValue.GetType().Name);
SwitchStep(newValue.GetType().Name);
}
}
}
///
/// 初始化字典
///
private void InitStep(List aZBSSteps)
{
if (aZBSSteps.Count == 0)
{
WDebug.LogError("当前界面没有实例化的步骤子类");
}
foreach (var item in aZBSSteps)
{
if (!dictStep.ContainsKey(item.GetType().Name))
{
dictStep.Add(item.GetType().Name, item);
}
}
}
///
/// 根据字符串获得到当前大步骤枚举下一个的元素值
///
///
private string GetAZBSState(string context)
{
for (int i = 0; i < azbsBigStepArray.Count; i++)
{
var key = azbsBigStepArray.ElementAt(i);
if (key.Equals(context))
{
if ((i + 1) == azbsBigStepArray.Count)
{
var newKey = azbsBigStepArray.ElementAt(i);
return newKey;
}
else
{
var newKey = azbsBigStepArray.ElementAt(i + 1);
return newKey;
}
}
}
return null;
}
public void OnSwitchInit(AZBS curState, AZBS nextState)
{
for (int i = 0; i < ModelManager.Instance.modelDatas.Count; i++)
{
GameObject itemGeo = ModelManager.Instance.modelDatas[i].modelPart;
OutLineRender lineR;
if (itemGeo.TryGetComponent(out lineR))
{
lineR.enabled = false;
}
}
if (curState.id > nextState.id)
{
ModelManager.Instance.InitAllGeo();
}
switch (nextState.stepName)
{
case ConstCtrl.BigStepName_LJQDDL:
ModelManager.Instance.InitAllGeo();
break;
case ConstCtrl.BigStepName_LJXHDL:
ModelManager.Instance.InitLJQDDLState(true);
break;
case ConstCtrl.BigStepName_SJQJX:
ModelManager.Instance.InitLJQDDLState(true);
ModelManager.Instance.InitLJXHDLState(true);
break;
case ConstCtrl.BigStepName_LJDYX:
ModelManager.Instance.InitLJQDDLState(true);
ModelManager.Instance.InitLJXHDLState(true);
ModelManager.Instance.InitSJQDLState(true);
ModelManager.Instance.InitLJDYXState(false);
break;
case ConstCtrl.BigStepName_SBKJ:
ModelManager.Instance.InitLJQDDLState(true);
ModelManager.Instance.InitLJXHDLState(true);
ModelManager.Instance.InitSJQDLState(true);
ModelManager.Instance.InitLJDYXState(true);
ModelManager.Instance.InitSBKJState(false);
break;
case ConstCtrl.BigStepName_ZXXL:
ModelManager.Instance.InitLJQDDLState(true);
ModelManager.Instance.InitLJXHDLState(true);
ModelManager.Instance.InitSJQDLState(true);
ModelManager.Instance.InitLJDYXState(true);
ModelManager.Instance.InitSBKJState(true);
break;
}
}
}
}