using CG.UTility; using System.Collections; using System.Collections.Generic; using UnityEngine; using DG.Tweening; using UnityEngine.Playables; using CG.Framework; using System; using UnityEngine.UI; using KinematicCharacterController; using KinematicCharacterController.Examples; /******************************************************************************* *Create By CG *Function *******************************************************************************/ namespace ZXK.LouDiXvMuNiu { public class NiuSceneMng : MonoBehaviour { public static NiuSceneMng _Instance = null; //物品展示 [SerializeField] private Transform[] _toolContain = null; [SerializeField]//所有作为标签出现在场景中的物体 private GameObject[] _signTrans = null; private List _curModuleToolArray = new List();//当前步骤需要用到的所有工具 //动画交互 public NiuData _CurSceneStep;//为了方便做对比,临时保存当前步骤 private Dictionary> _curStepUseBTDic;//当前步骤要点击的所有物体,true表示两个物体都要点,false表示点击其中一个即可 public Dictionary> _CurStepUseBtDic { get => _curStepUseBTDic; } private List _currentHighlights = new List(); private PlayableDirector _curTimeLine = null; private TimelineDirectorCtrl _curTimeLineCtrl = null; [SerializeField] private PlayableAsset _peoplePlanTimeLineClip = null; [SerializeField] private PlayableAsset _CSPLCLTimeLineClip = null; [SerializeField] private PlayableAsset _TQFQCLTimeLineClip = null; [SerializeField] private PlayableAsset _JZLVJCTimeLineClip = null; [SerializeField] private PlayableAsset _RGSJTimeLineClip = null; [SerializeField] private PlayableAsset _CPTimeLineClip = null; [SerializeField] private PlayableAsset _PTXZTimeLineClip = null; [SerializeField] private PlayableAsset _PTYZTimeLineClip = null; [SerializeField] private PlayableAsset _YYZDTimeLineClip = null; [SerializeField] private Transform _TQFQTran = null; [SerializeField] private Transform _CSPLTran = null; [SerializeField] private Transform _RGSJTran = null; [SerializeField] private Transform _CPTran = null; [SerializeField] private Transform _YYZDTran = null; [SerializeField] private Transform _PTYZTran = null; private KinematicCharacterMotor kinematic = null; private ExampleCharacterCamera characterCamera = null; public bool _isNearCameraTR = false; [ReadOnly]//是否正在播放动画 public bool _IsPlayAnm = false; private void Awake() { if (_Instance == null) { _Instance = this; } _curTimeLine = GetComponent(); _curTimeLineCtrl = GetComponent(); kinematic = Camera.main.GetComponent()._CameraCtrl.transform.GetComponent(); characterCamera = Camera.main.GetComponent(); GameManager.Instance._EventManager.AddListener(OnClickToolEvent); } private void Start() { GameManager.Instance._DataNiuHandler.CurNiuHandler.Value = new NiuData(); GetCurModuleTools(); InitFirstState(); StartCoroutine("InitScene"); } private IEnumerator InitScene() { yield return new WaitForSeconds(0.1f); List tempData = GameManager.Instance._DataNiuHandler.NiuStepTypeDic[GameManager.Instance._CurModelType]; if (GameManager.Instance._StateContext.GetState().Name.Equals("ExamState")) { for (int i = 0; i < tempData.Count; i++) { if (tempData[i].TaskType == ConstCtrl.TASKTYPE_ShowGeo) { _CurSceneStep = tempData[i]; break; } } } else { _CurSceneStep = tempData[0]; } GameManager.Instance._DataNiuHandler.CurNiuHandler.Value = _CurSceneStep; if (GameManager.Instance._loopPopExplain) { GameObject explainContainGeo = UI_Manage.Instance.ShowPanel("ExplainContainPanel", System.Type.GetType("ZXK.LouDiXvMuNiu.ExplainContainPanel"), UIGroup.Tip); explainContainGeo.GetComponent().InitUIState(true); } } private void Update() { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit rayHit; NiuData curdata = GameManager.Instance._DataNiuHandler.CurNiuHandler.Value; if (PopUpMng._TriAble && _CurSceneStep != null && !string.IsNullOrEmpty(curdata.TaskType)) { UI_Manage.Instance.HidePanel("TooltipBoxTip"); if (Physics.Raycast(ray, out rayHit, Mathf.Infinity)) { RecognizeNewGeo(rayHit, "牛的精液", rayHit.transform.name); RecognizeNewGeo(rayHit, "OpenZhuShe", "注射器"); if (_curModuleToolArray.Contains(rayHit.transform)) { Vector3 worldPos = rayHit.point; if (rayHit.transform.name == "baodingjiaJH") {//如果是牛的保定架,只有在物品展示的环节显示标签,其他环节不显示 if (curdata.TaskType.Equals(ConstCtrl.TASKTYPE_ShowGeo)) { PopUpMng.ShowToolInfoTip(rayHit.transform.name, worldPos + Vector3.up * 0.05f, -1); } } else { PopUpMng.ShowToolInfoTip(rayHit.transform.name, worldPos + Vector3.up * 0.05f, -1); } } } if (UnityEngine.EventSystems.EventSystem.current != null) { if (UnityEngine.EventSystems.EventSystem.current.IsPointerOverGameObject()) return; } if (_CurSceneStep.TaskType.Equals(ConstCtrl.TASKTYPE_Anim)) {//timeline动画 if (Input.GetMouseButtonDown(0) && Physics.Raycast(ray, out rayHit, Mathf.Infinity) && !_IsPlayAnm) { if (!string.IsNullOrEmpty(curdata.CameraNearTR2) && _isNearCameraTR) { CameraSetNear2TR(curdata); } ClickToolCallInTrainState(rayHit.transform.gameObject, () => { UI_Manage.Instance.HidePanel("ShowToastUIPrefab"); JumpTimeline(GameManager.Instance._DataNiuHandler.GetNextStep(), false); }); ClickToolCallInExamState(rayHit.transform.gameObject, () => { UI_Manage.Instance.HidePanel("ShowToastUIPrefab"); JumpTimeline(GameManager.Instance._DataNiuHandler.GetNextStep(_CurSceneStep.QNextNum), false); }); } } else if (_CurSceneStep.TaskType.Equals(ConstCtrl.TASKTYPE_Video)) { if (Input.GetMouseButtonDown(0) && Physics.Raycast(ray, out rayHit, Mathf.Infinity)) { ClickToolCallInTrainState(rayHit.transform.gameObject, () => { GameObject videoGeo = UI_Manage.Instance.ShowPanel("VideoShowPanel", Type.GetType("ZXK.LouDiXvMuNiu.VideoShowPanel"), UIGroup.Tip); videoGeo.GetComponent().PlayVideoClip(_CurSceneStep.VideoPath, () => { UI_Manage.Instance.HidePanel("ShowToastUIPrefab"); GameManager.Instance._DataNiuHandler.CurNiuHandler.Value = GameManager.Instance._DataNiuHandler.GetNextStep(); }); }); } } } } private void OnDestroy() { _curTimeLineCtrl?.Stop(); GameManager.Instance._EventManager.RemoveListener(OnClickToolEvent); } private void OnClickToolEvent(ClickToolArgs e) { if (GameManager.Instance._StateContext.GetState().Name.Equals("ExamState")) { if (e.SelectTool == "牛的精液") { string[] temp = new string[] { "牛的精液A", "牛的精液B", "牛的精液C" }; for (int a = 0; a < temp.Length; a++) { GameObject toolTempGeo = UtilitiesMng.GetGeoByName(_toolContain, temp[a], true); toolTempGeo.SetActive(true); } } else { GameObject toolGeo = UtilitiesMng.GetGeoByName(_toolContain, e.SelectTool, true); toolGeo?.SetActive(true); } } } /// /// 播放动画前场景物体状态 /// private void InitFirstState() { foreach (Transform t in _TQFQTran) { t.gameObject.SetActive(false); } foreach (Transform t in _CSPLTran) { t.gameObject.SetActive(false); } foreach (Transform t in _RGSJTran) { t.gameObject.SetActive(false); } foreach (Transform t in _PTYZTran) { t.gameObject.SetActive(false); } //默认工具全不显示 UseToolsActive(false); } public void InitPlayAnmState(NiuData curObj, NiuData previousObj) { if (curObj == null) return; if (curObj.TaskName != previousObj.TaskName) { InitFirstState(); if (GameManager.Instance._CurModelType.Equals(ConstCtrl.ModuleName_TQFAQCL)) { GameObject jiaziGeo = UtilitiesMng.GetGeoByName(_toolContain, "M_Jiazi_b", true); jiaziGeo.transform.localPosition = new Vector3(-0.3f, 0.5998f, 2.47f); jiaziGeo.transform.localRotation = Quaternion.Euler(Vector3.zero); _TQFQTran.Find("SM_Niu_CaShi_an01").gameObject.SetActive(true); } else if (GameManager.Instance._CurModelType.Equals(ConstCtrl.ModuleName_CSPLCL)) { GameObject jiaziGeo = UtilitiesMng.GetGeoByName(_toolContain, "M_Jiazi_b", true); jiaziGeo.transform.localPosition = new Vector3(-0.3f, 0.5998f, 0.157f); jiaziGeo.transform.localRotation = Quaternion.Euler(Vector3.zero); GameObject boziGeo = _CSPLTran.Find("SM_Niu_ZhusheB_Bozi_an_B01(2)").gameObject; boziGeo.SetActive(true); boziGeo.transform.Find("Yisheng_ok:Doctor").gameObject.SetActive(false); boziGeo.transform.Find("SM_XiaoTuiChe_Zhusheqi").gameObject.SetActive(false); } else if (GameManager.Instance._CurModelType.Equals(ConstCtrl.ModuleName_JZLVJC)) { } else if (GameManager.Instance._CurModelType.Equals(ConstCtrl.ModuleName_RGSJ)) { GameObject jiaziGeo = UtilitiesMng.GetGeoByName(_toolContain, "M_Jiazi_b", true); jiaziGeo.transform.localPosition = new Vector3(-0.485f, 0.5997721f, 2.109f); jiaziGeo.transform.localRotation = Quaternion.Euler(Vector3.zero); GameObject gjj2Geo = UtilitiesMng.GetGeoByName(_toolContain, "工具架2", true); gjj2Geo.gameObject.SetActive(true); _RGSJTran.Find("SM_Niu_RenGongSouJing01").gameObject.SetActive(true); } else if (GameManager.Instance._CurModelType.Equals(ConstCtrl.ModuleName_CP)) { GameObject jiaziGeo = UtilitiesMng.GetGeoByName(_toolContain, "M_Jiazi_b", true); jiaziGeo.transform.localPosition = new Vector3(-0.81f, 0.632f, 2.883f); jiaziGeo.transform.localRotation = Quaternion.Euler(Vector3.up * -180.0f); Transform toolTemp = jiaziGeo.transform.Find("冲卵管"); //foreach (Transform item in toolTemp) //{ // item.gameObject.SetActive(true); //} if (GameManager.Instance._StateContext.GetState().Name.Equals("TrainState")) {//如果训练模式下,物品展示时显示物品 if (curObj.ThreeTaskName == ConstCtrl.ThreeTaskName_PrepareGeo) { foreach (Transform item in toolTemp) { item.gameObject.SetActive(true); } } } _CPTran.Find("SM_Doctor").gameObject.SetActive(true); _CPTran.Find("SM_Niu_ChongPei01").gameObject.SetActive(true); _CPTran.Find("SM_Niu_ChongPei").gameObject.SetActive(true); } else if (GameManager.Instance._CurModelType.Equals(ConstCtrl.ModuleName_PTXZ)) { } else if (GameManager.Instance._CurModelType.Equals(ConstCtrl.ModuleName_PTYZ)) { GameObject jiaziGeo = UtilitiesMng.GetGeoByName(_toolContain, "M_Jiazi_b", true); jiaziGeo.transform.localPosition = new Vector3(-0.485f, 0.5997721f, 2.109f); jiaziGeo.transform.localRotation = Quaternion.Euler(Vector3.zero); _PTYZTran.Find("SM_PeiTaiYiZhi03").gameObject.SetActive(true); } else if (GameManager.Instance._CurModelType.Equals(ConstCtrl.ModuleName_YYZD)) { GameObject jiaziGeo = UtilitiesMng.GetGeoByName(_toolContain, "M_Jiazi_b", true); jiaziGeo.transform.localPosition = new Vector3(-0.81f, 0.632f, 2.883f); jiaziGeo.transform.localRotation = Quaternion.Euler(Vector3.up * -180.0f); _YYZDTran.Find("niu_yindaojiancha").gameObject.SetActive(true); } } if (curObj.ThreeTaskName != previousObj.ThreeTaskName) { if (GameManager.Instance._StateContext.GetState().Name.Equals("TrainState")) {//如果训练模式下,物品展示时显示物品 if (curObj.ThreeTaskName == ConstCtrl.ThreeTaskName_PrepareGeo) { NiuSceneMng._Instance.UseToolsActive(true); } } //需要点击的物体在人员准备的时候重新全部显示 if (curObj.ThreeTaskName == ConstCtrl.ThreeTaskName_PeoplePlan) { List curSteps = GameManager.Instance._DataNiuHandler.NiuStepTypeDic[GameManager.Instance._CurModelType]; for (int i = 0; i < curSteps.Count; i++) { if (curSteps[i].ThreeTaskName == ConstCtrl.ThreeTaskName_PeoplePlan) { string toolStr = curSteps[i].ModelBT; GameObject toolGeo = UtilitiesMng.GetGeoByName(new Transform[1] { transform }, toolStr, true); toolGeo.SetActive(true); } } } if (GameManager.Instance._CurModelType.Equals(ConstCtrl.ModuleName_TQFAQCL)) { SetTimeLineCtrl(curObj, previousObj, _TQFQCLTimeLineClip, 0); } else if (GameManager.Instance._CurModelType.Equals(ConstCtrl.ModuleName_CSPLCL)) { SetTimeLineCtrl(curObj, previousObj, _CSPLCLTimeLineClip, 0); } else if (GameManager.Instance._CurModelType.Equals(ConstCtrl.ModuleName_JZLVJC)) { if (GameManager.Instance._StateContext.GetState().Name.Equals("TrainState")) { SetTimeLineCtrl(curObj, previousObj, _JZLVJCTimeLineClip, 0); } else { SetTimeLineCtrl(curObj, previousObj, _JZLVJCTimeLineClip, 120 / 60.0f); } } else if (GameManager.Instance._CurModelType.Equals(ConstCtrl.ModuleName_RGSJ)) { if (GameManager.Instance._StateContext.GetState().Name.Equals("TrainState")) {//如果训练模式下,物品展示时显示物品 SetTimeLineCtrl(curObj, previousObj, _RGSJTimeLineClip, 0); if (curObj.ThreeTaskName == ConstCtrl.ThreeTaskName_PrepareGeo) { GameObject geoTemp = UtilitiesMng.GetGeoByName(_toolContain, "baodingjiaJH", true); geoTemp.SetActive(true); } } else { SetTimeLineCtrl(curObj, previousObj, _RGSJTimeLineClip, 5 / 60.0f); } } else if (GameManager.Instance._CurModelType.Equals(ConstCtrl.ModuleName_CP)) { GameObject jiaziGeo = UtilitiesMng.GetGeoByName(_toolContain, "M_Jiazi_b", true); Transform toolTemp = jiaziGeo.transform.Find("冲卵管"); //foreach (Transform item in toolTemp) //{ // item.gameObject.SetActive(true); //} if (GameManager.Instance._StateContext.GetState().Name.Equals("TrainState")) {//如果训练模式下,物品展示时显示物品 SetTimeLineCtrl(curObj, previousObj, _CPTimeLineClip, 0); if (curObj.ThreeTaskName == ConstCtrl.ThreeTaskName_PrepareGeo) { foreach (Transform item in toolTemp) { item.gameObject.SetActive(true); } GameObject geoTemp = UtilitiesMng.GetGeoByName(_toolContain, "baodingjiaJH", true); geoTemp.SetActive(true); } } else { SetTimeLineCtrl(curObj, previousObj, _CPTimeLineClip, 5 / 60.0f); } } else if (GameManager.Instance._CurModelType.Equals(ConstCtrl.ModuleName_PTXZ)) { SetTimeLineCtrl(curObj, previousObj, _PTXZTimeLineClip, 0); } else if (GameManager.Instance._CurModelType.Equals(ConstCtrl.ModuleName_PTYZ)) { SetTimeLineCtrl(curObj, previousObj, _PTYZTimeLineClip, 0); if (GameManager.Instance._StateContext.GetState().Name.Equals("TrainState")) {//如果训练模式下,物品展示时显示物品 if (curObj.ThreeTaskName == ConstCtrl.ThreeTaskName_PrepareGeo) { GameObject bhyGeoTemp = UtilitiesMng.GetGeoByName(_toolContain, "保护液", true); bhyGeoTemp.transform.localPosition = new Vector3(-0.0822f, 0.396500051f, 0.00615262985f); bhyGeoTemp.transform.localRotation = new Quaternion(0,0.707106829f,0.707106829f,0); GameObject ptygeoTemp = UtilitiesMng.GetGeoByName(_toolContain, "胚胎液", true); ptygeoTemp.transform.localPosition = new Vector3(-0.0820000023f, 0.396499991f, -0.0887999982f); ptygeoTemp.transform.localRotation = new Quaternion(0, 0.707106829f, 0.707106829f, 0); GameObject ksqgeoTemp = UtilitiesMng.GetGeoByName(_toolContain, "凯苏枪", true); ksqgeoTemp.transform.localPosition = new Vector3(0.25999999f, 0.409000009f, 0.381999999f); ksqgeoTemp.transform.localRotation = new Quaternion(-0.00385814067f, 0.707096279f, 0.00385814067f, 0.707096279f); GameObject blxggeoTemp = UtilitiesMng.GetGeoByName(_toolContain, "玻璃细管", true); blxggeoTemp.transform.localPosition = new Vector3(0.221799999f, 0.400900006f, -0.0782999992f); blxggeoTemp.transform.localRotation = new Quaternion(0.5f, 0.5f, 0.5f, 0.5f); } } } else if (GameManager.Instance._CurModelType.Equals(ConstCtrl.ModuleName_YYZD)) { GameObject jiaziGeo = UtilitiesMng.GetGeoByName(_toolContain, "M_Jiazi_b", true); Transform toolTemp = jiaziGeo.transform.Find("开窒器"); foreach (Transform item in toolTemp) { item.gameObject.SetActive(true); } if (GameManager.Instance._StateContext.GetState().Name.Equals("TrainState")) {//如果训练模式下,物品展示时显示物品 if (curObj.ThreeTaskName == ConstCtrl.ThreeTaskName_PrepareGeo) { foreach (Transform item in toolTemp) { item.gameObject.SetActive(false); } } } SetTimeLineCtrl(curObj, previousObj, _YYZDTimeLineClip, 0); } } } /// /// 根据不同任务名称切换动画控制器 /// private void SetTimeLineCtrl(NiuData curObj, NiuData previousObj, PlayableAsset timeAsset,double pauseTime) { if (curObj!=null&& previousObj!=null) { if (curObj.TaskName.Equals(ConstCtrl.TaskName_ActualOperation)) { if (_curTimeLine.playableAsset != timeAsset) { _curTimeLine.playableAsset = timeAsset; _curTimeLineCtrl.SetDuration(); _curTimeLineCtrl.StopInTime(pauseTime); } } else if (curObj.TaskName.Equals(ConstCtrl.TaskName_OperationPlan)) { if (GameManager.Instance._StateContext.GetState().Name.Equals("ExamState")) { if (_curTimeLine.playableAsset != _peoplePlanTimeLineClip) { _curTimeLine.playableAsset = _peoplePlanTimeLineClip; _curTimeLineCtrl.SetDuration(); _curTimeLineCtrl.Stop(); } } else { if (curObj.ThreeTaskName == ConstCtrl.ThreeTaskName_PrepareGeo) { if (_curTimeLine.playableAsset != timeAsset) { _curTimeLine.playableAsset = timeAsset; _curTimeLineCtrl.SetDuration(); _curTimeLineCtrl.StopInTime(pauseTime); } } if (curObj.ThreeTaskName == ConstCtrl.ThreeTaskName_PeoplePlan) { if (_curTimeLine.playableAsset != _peoplePlanTimeLineClip) { _curTimeLine.playableAsset = _peoplePlanTimeLineClip; _curTimeLineCtrl.SetDuration(); _curTimeLineCtrl.Stop(); } } } } } } /// /// 获取当前模块需要用到的工具 /// /// private void GetCurModuleTools() { List toolArray = new List(); List tempData = GameManager.Instance._DataNiuHandler.NiuStepTypeDic[GameManager.Instance._CurModelType]; for (int i = 0; i < tempData.Count; i++) { if (string.IsNullOrEmpty(tempData[i].ToolsName)) continue; string[] tools = tempData[i].ToolsName.Split("|"); for (int j = 0; j < tools.Length; j++) { GameObject toolGeo = UtilitiesMng.GetGeoByName(_toolContain, tools[j], true); if (toolGeo&&!toolArray.Contains(tools[j])) { toolArray.Add(tools[j]); _curModuleToolArray.Add(toolGeo.transform); } } } } /// /// 该模块用到的所有工具显示状态 /// /// public void UseToolsActive(bool showAble) { for (int i = 0; i < _currentHighlights.Count; i++) { _currentHighlights[i].enabled = false; } for (int i = 0; i < _curModuleToolArray.Count; i++) { _curModuleToolArray[i].gameObject.SetActive(showAble); } } /// /// 获取此步骤需要点击的工具 /// /// public void GetNeedClickTools(NiuData step) { _curStepUseBTDic = new Dictionary>(); List toolTemp = new List(); if (GameManager.Instance._StateContext.GetState().Name.Equals("TrainState")) { string[] tempBts = step.ModelBT.Split("|"); string[] tempSelects = tempBts[0].Split("+"); for (int i = 0; i < tempSelects.Length; i++) { GameObject tempGeo = UtilitiesMng.GetGeoByName(new Transform[1] { transform }, tempSelects[i], step.ThreeTaskName != ConstCtrl.ThreeTaskName_PeoplePlan); if (tempGeo == null) continue; tempGeo.SetActive(true); toolTemp.Add(tempGeo); } _curStepUseBTDic.Add(true, toolTemp); } if (GameManager.Instance._StateContext.GetState().Name.Equals("ExamState")) { string[] tempBts = step.ModelBT.Split("|"); if (!string.IsNullOrEmpty(step.ExamModelBT)) { tempBts = step.ExamModelBT.Split("|"); } for (int i = 0; i < tempBts.Length; i++) { string[] tempExamSelects = null; if (tempBts[i].Contains("+")) { tempExamSelects = tempBts[i].Split("+"); } else if (tempBts[i].Contains("*")) { tempExamSelects = tempBts[i].Split("*"); } else { tempExamSelects = new string[1] { tempBts[i] }; } for (int j = 0; j < tempExamSelects.Length; j++) { GameObject tempGeo = UtilitiesMng.GetGeoByName(new Transform[1] { transform }, tempExamSelects[j], true); if (tempGeo == null) continue; tempGeo.SetActive(true); if (i == 0) { toolTemp.Add(tempGeo); } } if (tempBts[i].Contains("*")) { if (!_curStepUseBTDic.ContainsKey(false)) { _curStepUseBTDic.Add(false, toolTemp); } } else { if (!_curStepUseBTDic.ContainsKey(true)) { _curStepUseBTDic.Add(true, toolTemp); } } } } } /// /// 让此步骤需要点击的物体高亮显示 /// /// 需要点击物体名字 public void OnlyShowBTGeo(GameObject[] modelBTsName) { for (int i = 0; i < _currentHighlights.Count; i++) { _currentHighlights[i].enabled = false; } for (int i = 0; i < modelBTsName.Length; i++) { string modelBTName = modelBTsName[i].name; if (!modelBTName.Contains("_sign")) { OutLineRender outlineRender; // 如果模型上没有泛光效果组件,则添加一个新的 if (!modelBTsName[i].TryGetComponent(out outlineRender)) { outlineRender = modelBTsName[i].AddComponent(); } // 设置泛光强度和默认禁用泛光效果 outlineRender.OutLineStrength = 1; outlineRender.enabled = true; // 将泛光效果组件添加到高亮列表中 _currentHighlights.Add(outlineRender); } } } /// /// 训练模式下点击物体触发下一步 /// /// /// private void ClickToolCallInTrainState(GameObject triGeo,Action clickFinishCall) { if (GameManager.Instance._StateContext.GetState().Name.Equals("ExamState")) return; if (_curStepUseBTDic.ContainsKey(true)) { List useBts = _curStepUseBTDic[true]; if (useBts.Contains(triGeo)) { if (triGeo.GetComponent()) { triGeo.GetComponent().enabled = false; } if (triGeo.tag != ConstCtrl.SceneTool_Tag) { triGeo.SetActive(false); } useBts.Remove(triGeo); } if (useBts.Count == 0) { foreach (var item in _curStepUseBTDic) { for (int i = 0; i < item.Value.Count; i++) { if (item.Value[i].tag != ConstCtrl.SceneTool_Tag) { item.Value[i].SetActive(false); } } } _curStepUseBTDic.Clear(); clickFinishCall?.Invoke(); } } } /// /// 考核模式下点击物体触发下一步 /// /// /// private void ClickToolCallInExamState(GameObject triGeo, Action clickFinishCall) { if (GameManager.Instance._StateContext.GetState().Name.Equals("ExamState")) { bool addScoreTemp = true; List useBts = new List(); if (_curStepUseBTDic.ContainsKey(false)) { useBts = _curStepUseBTDic[false]; if (useBts.Contains(triGeo)) { useBts.Clear(); } } else if(_curStepUseBTDic.ContainsKey(true)) { useBts = _curStepUseBTDic[true]; if (useBts.Contains(triGeo)) { if (triGeo.GetComponent()) { triGeo.GetComponent().enabled = false; } if (triGeo.tag != ConstCtrl.SceneTool_Tag) { triGeo.SetActive(false); } useBts.Remove(triGeo); } else { useBts.Clear(); addScoreTemp = false; PopUpMng.PopChoseErrorToast(_CurSceneStep.ExamEvvr, 2.0f,null); } } if (useBts.Count == 0) { foreach (var item in _curStepUseBTDic) { for (int i = 0; i < item.Value.Count; i++) { if (item.Value[i].tag != ConstCtrl.SceneTool_Tag) { item.Value[i].SetActive(false); } } } for (int i = 0; i < _signTrans.Length; i++) { _signTrans[i].SetActive(false); } _curStepUseBTDic.Clear(); if (addScoreTemp) { GameManager.Instance._DataNiuHandler.AddScore(_CurSceneStep.ModuleName, _CurSceneStep.ThreeTaskName, _CurSceneStep.Score); } clickFinishCall?.Invoke(); } } } /// /// 步骤是答题系统类型的处理方式 /// /// public void AnswerSystemInStep(NiuData step) { string[] answers = step.OptionsAll.Split("|"); if (step.id == 244) { PopUpMng.PopAnswerImgQuestions(step.Question, answers, GetOptionIndex(step.OptionRight), () => { JumpTimeline(GameManager.Instance._DataNiuHandler.GetNextStep(_CurSceneStep.QNextNum), false); }); } else { PopUpMng.PopAnswerQuestions(step.Question, answers, GetOptionIndex(step.OptionRight), () => { JumpTimeline(GameManager.Instance._DataNiuHandler.GetNextStep(_CurSceneStep.QNextNum), false); }); } } /// /// 步骤是过渡类型的处理方式 /// /// public void TimeTranInStep(NiuData step) { _IsPlayAnm = true; string[] msg = step.ModelBT.Split("|"); string timeFixMsg = msg[0]; string[] timepoints = msg[1].Split("-"); int startTime = int.Parse(timepoints[0]); int endTime = int.Parse(timepoints[1]); PopUpMng.PopTimeIntCount(timeFixMsg, startTime, endTime, 3.0f, endTime >= startTime, () => { if (GameManager.Instance._StateContext.GetState().Name.Equals("TrainState")) { JumpTimeline(GameManager.Instance._DataNiuHandler.GetNextStep(), false); //GameManager.Instance._DataNiuHandler.CurNiuHandler.Value = GameManager.Instance._DataNiuHandler.GetNextStep(); } else if (GameManager.Instance._StateContext.GetState().Name.Equals("ExamState")) { JumpTimeline(GameManager.Instance._DataNiuHandler.GetNextStep(_CurSceneStep.QNextNum), false); //GameManager.Instance._DataNiuHandler.CurNiuHandler.Value = GameManager.Instance._DataNiuHandler.GetNextStep(_CurSceneStep.QNextNum); } _IsPlayAnm = false; }); } /// /// 步骤是过渡动画类型的处理方式 /// /// public void TimeTranAnmInStep(NiuData step) { string[] msg = step.ModelBT.Split("|"); string timeFixMsg = msg[0]; string[] timepoints = msg[1].Split("-"); int startTime = int.Parse(timepoints[0]); int endTime = int.Parse(timepoints[1]); if (GameManager.Instance._StateContext.GetState().Name.Equals("TrainState")) { JumpTimeline(GameManager.Instance._DataNiuHandler.GetNextStep(), false); } else if (GameManager.Instance._StateContext.GetState().Name.Equals("ExamState")) { JumpTimeline(GameManager.Instance._DataNiuHandler.GetNextStep(_CurSceneStep.QNextNum), false); } float durTime = step.TimelineLength / 60.0f; PopUpMng.PopTimeIntCount(timeFixMsg, startTime, endTime, durTime, endTime >= startTime, null); } /// /// 图片选择类题型 /// 目前只有胚胎选择最后一步需要 /// /// public void ChoiceImgInStep(string[] temp) { if (GameManager.Instance._StateContext.GetState().Name.Equals("TrainState")) { GameObject tempGeo = UtilitiesMng.GetGeoByName(new Transform[1] { transform }, temp[0], true); tempGeo.SetActive(true); tempGeo.GetComponent().isOn = false; tempGeo.GetComponent().onValueChanged.AddListener((isOn) => { if (isOn) { //tempGeo.transform.GetChild(0).gameObject.SetActive(true); //float a = 0.0f; //DOTween.To(() => a, x => x = a, 1.0f, 2.0f).OnComplete(() => //{ // tempGeo.SetActive(false); //}); JumpTimeline(GameManager.Instance._DataNiuHandler.GetNextStep(), false); tempGeo.SetActive(false); } }); } else if (GameManager.Instance._StateContext.GetState().Name.Equals("ExamState")) { List togs = new List(); for (int i = 0; i < temp.Length; i++) { GameObject tempGeo = UtilitiesMng.GetGeoByName(new Transform[1] { transform }, temp[i], true); tempGeo.transform.GetChild(0).gameObject.SetActive(false); togs.Add(tempGeo); tempGeo.SetActive(true); tempGeo.GetComponent().isOn = false; tempGeo.GetComponent().onValueChanged.AddListener((isOn) => { if (isOn) { for (int i = 0; i < togs.Count; i++) { togs[i].transform.GetChild(0).gameObject.SetActive(true); } float a = 0.0f; DOTween.To(() => a, x => x = a, 1.0f, 2.0f).OnComplete(() => { for (int i = 0; i < togs.Count; i++) { togs[i].SetActive(false); } }); JumpTimeline(GameManager.Instance._DataNiuHandler.GetNextStep(), false); } }); } } } /// /// 继续播放Timeline动画 /// public void TimelineContinue() { _curTimeLineCtrl.Continue(); } /// /// 跳转动画步骤 /// /// public void JumpTimeline(NiuData partData,bool jumpStepAble) { if (_CurSceneStep == null) _CurSceneStep = partData; if (_CurSceneStep.id == partData.id) {//相同步骤不跳转 } else {//跳转不同步骤,可能是点击上下步产生的,每次点击上下步对应的跳转是上下步里面的第一个小步骤 _IsPlayAnm = true; if (_CurSceneStep.id > partData.id) {//逆序跳转,倒播 if (!jumpStepAble) { _curTimeLineCtrl.ContinuePlayBackwardByPausePoint(GetPlayTime(_CurSceneStep,partData, jumpStepAble), () => { NegativeJumpStep(partData); }); } else { _curTimeLineCtrl.StopInTime(GetPlayTime(_CurSceneStep, partData, jumpStepAble)); NegativeJumpStep(partData); } } else if (_CurSceneStep.id < partData.id) {//顺序跳转,正播 if (!jumpStepAble) { _curTimeLineCtrl.ContinuePlayForwardByPausePoint(GetPlayTime(_CurSceneStep, partData, jumpStepAble), () => { PositiveJumpStep(partData); }); } else { _curTimeLineCtrl.StopInTime(GetPlayTime(_CurSceneStep, partData, jumpStepAble)); PositiveJumpStep(partData); } } } } public void JumpToTime(float time) { _curTimeLineCtrl.ContinuePlayBackwardByPausePoint(time, null); } /// /// 正向跳转步骤 /// /// private void PositiveJumpStep(NiuData partData) { _IsPlayAnm = false; _CurSceneStep = partData; GameManager.Instance._DataNiuHandler.CurNiuHandler.Value = partData; } /// /// 反向跳转步骤 /// /// private void NegativeJumpStep(NiuData partData) { _IsPlayAnm = false; _CurSceneStep = partData; GameManager.Instance._DataNiuHandler.CurNiuHandler.Value = partData; } /// /// 获取当前要播放的动画片段的开始时间 /// /// /// private float GetPlayTime(NiuData perviousStep,NiuData step, bool jumpStepAble) { int allFrame = 0; List modelInfos = GameManager.Instance._DataNiuHandler.NiuStepTypeDic[GameManager.Instance._CurModelType]; string addAbleTaskName = null; if (jumpStepAble) { addAbleTaskName = step.TaskName; } else { if(perviousStep.TaskName!= step.TaskName) { addAbleTaskName = perviousStep.TaskName; } else { addAbleTaskName = step.TaskName; } } for (int a = 0; a < modelInfos.Count; a++) { if (modelInfos[a].TaskName.Equals(addAbleTaskName) && modelInfos[a].id < step.id) { allFrame += modelInfos[a].TimelineLength; } } return allFrame / 60.0f; } public int GetOptionIndex(string OptionMsg) { switch (OptionMsg) { case "A": return 0; case "B": return 1; case "C": return 2; case "D": return 3; default: return 0; } } /// /// 设置摄像机为近距离视角 /// public void CameraSetNearTR(NiuData obj) { if (string.IsNullOrEmpty(obj.CameraNearTR)) return; _isNearCameraTR = true; try { string[] cameraDefaultTR = obj.CameraNearTR.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; } } /// /// 设置摄像机为默认视角 /// /// public void CameraSetDefaultTR(NiuData obj) { if (string.IsNullOrEmpty(obj.CameraDefaultTR)) return; _isNearCameraTR = false; 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; } } /// /// 设置摄像机为近距离视角 /// public void CameraSetNear2TR(NiuData obj) { if (string.IsNullOrEmpty(obj.CameraNearTR2)) return; try { string[] cameraDefaultTR = obj.CameraNearTR2.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; } } /// /// 调整场景摄像机位置 /// /// /// public void ChangeCameraPos(Vector3 pos, Vector3 rot) { ///设置人偶物体旋转,位置 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; characterCamera.ResetTR(rot); } private void RecognizeNewGeo(RaycastHit rayHit, string RecognizeName,string tranName) { if (rayHit.transform.name.Contains(RecognizeName)) { Vector3 worldPos = rayHit.point; PopUpMng.ShowToolInfoTip(tranName, worldPos + Vector3.up * 0.05f, -1); } } public void StepSetCameraTR(NiuData curStep,NiuData NextStep) { int curID = curStep.id; int nextID = NextStep.id; if (nextID - curID > 1&& curStep.ThreeTaskName!=ConstCtrl.ThreeTaskName_PeoplePlan) { Debug.Log("绑定事件:" + curID); int allFrame = 0; List modelInfos = GameManager.Instance._DataNiuHandler.NiuStepTypeDic[GameManager.Instance._CurModelType]; for (int a = 0; a < modelInfos.Count; a++) { if (modelInfos[a].TaskName.Equals(curStep.TaskName)) { allFrame += modelInfos[a].TimelineLength; } if (modelInfos[a].id == curID) { for (int i = 0; i < nextID-curID-1; i++) { Debug.Log("插入key:" + allFrame / 60.0f); if (!_curTimeLineCtrl.OnTriDic.ContainsKey(allFrame / 60.0f)) { _curTimeLineCtrl.OnTriDic.Add(allFrame / 60.0f, (time) => { OperationStepPanel operationStep = UI_Manage.Instance.GetPanel("OperationStepPanel").GetComponent(); List modelInfos = GameManager.Instance._DataNiuHandler.NiuStepTypeDic[GameManager.Instance._CurModelType]; int allFrameTemp = 0; NiuData curTempStep = null; for (int i = 0; i < modelInfos.Count; i++) { if (modelInfos[i].TaskName.Equals(ConstCtrl.TaskName_ActualOperation)) { allFrameTemp += modelInfos[i].TimelineLength; } if (Math.Abs(allFrameTemp / 60.0f - time) < 0.01f) { curTempStep = modelInfos[i+1]; if (curTempStep.TaskType == ConstCtrl.TASKTYPE_Tran) curTempStep = modelInfos[i + 2]; break; } } operationStep.UodateCameraTRID(curTempStep); Debug.Log(curID+i+1); }); } allFrame += modelInfos[a + i+1].TimelineLength; } break; } } } } } }