using System; using System.Collections; using UnityEngine; using UnityEngine.Events; using ZXKFramework; //辽宁交专 public class LiaoNingJiaoZhuanLauncher : MonoSingleton { GameModel gameModel; AClipManager[] clipManagerArray; ModelShowManager modelShow; ModelClickManager modelClick; ModelChildShowOneBase clipManagerShowOneBase = new(); AClipManager clipManagerCurrent; PlayerMovement playerMovement; TargetToScreen targetToScreen; TimeCounterManager timeCounterManager; ScoreManager scoreManager; ProcessManager processManager; ResultManager resultManager; NetManager netManager; protected override void Awake() { base.Awake(); clipManagerShowOneBase.Init(transform.FindFirst("ClipManager")); clipManagerArray = GetComponentsInChildren(true); if(clipManagerArray.Length > 0) { for (int i = 0; i < clipManagerArray.Length; i++) { clipManagerArray[i]?.Init(); } } modelShow = GetComponentInChildren(true); modelShow?.Init(); modelClick = GetComponentInChildren(true); modelClick?.Init(); playerMovement = GetComponentInChildren(true); targetToScreen = GetComponentInChildren(true); timeCounterManager = GetComponentInChildren(true); scoreManager = GetComponentInChildren(true); scoreManager?.Init(); processManager = GetComponentInChildren(true); processManager?.Init(); resultManager = GetComponentInChildren(true); resultManager?.Init(); netManager = GetComponentInChildren(true); netManager?.Init(); } void Start() { MVC.RegisterModel(new GameModel()); gameModel = MVC.GetModel(); gameModel.Init(); Game.Instance.eventManager.AddListener(OnCloseModelEvent); Game.Instance.eventManager.AddListener(OnWorkBtnClipEvent); Game.Instance.eventManager.AddListener(OnImageChangeEvent); Game.Instance.eventManager.AddListener(OnCloseImageEvent); Game.Instance.eventManager.AddListener(OnHomeEvent); Game.Instance.eventManager.AddListener(OnCloseQuestionEvent); Game.Instance.eventManager.AddListener(OnMessageTypeEvent); Game.Instance.eventManager.AddListener(OnScoreRecordEvent); Game.Instance.eventManager.AddListener(OnProcessEvent); Game.Instance.eventManager.AddListener(OnStepRecordEvent); //切换到开始状态 Game.Instance.fsm.ChangeState(); } /// /// 事件类型事件监听 /// private void OnMessageTypeEvent(MessageTypeEvent e) { OnMessageType(e.type,e.id); } /// /// 返回主页事件监听 /// private void OnHomeEvent(HomeEvent e) { Game.Instance.sound.StopBGM(); modelShow?.HideModel(); modelShow?.HideCamera(); modelClick?.HideModel(); playerMovement?.ResetPos(); //重置动画 clipManagerCurrent = GetClipManager(gameModel.mainData.GetClipManager(gameModel.GetId())); clipManagerCurrent?.ResetClip(); StopAllCoroutines(); if(e.type == "Welcome") { Game.Instance.fsm.ChangeState(); }else if (e.type == "Mode") { gameModel.SetId(gameModel.mainData.GetMinId(gameModel.mainData.GetModuleName(gameModel.GetId()))); Game.Instance.fsm.ChangeState(); } if (gameModel.GetModeType() == ModeType.KaoHe) { StopTimeCounter(false); netManager?.SendData(resultManager?.ToJson()); } } /// /// 图片切换事件监听 /// private void OnImageChangeEvent(ImageChangeEvent e) { if (gameModel.GetModeType() == ModeType.LiuLan) { string speakText = gameModel.imageData.GetImageSoundText(e.id); if (!string.IsNullOrEmpty(speakText)) { Game.Instance.uiManager.ShowUI(null, speakText); } string audioPath = gameModel.imageData.GetImageSoundPath(e.id); if (!string.IsNullOrEmpty(audioPath)) { Game.Instance.sound.PlayBGM(audioPath, false); } } } /// /// 关闭模型事件监听 /// private void OnCloseModelEvent(CloseModelEvent e) { modelShow?.HideModel(); modelShow?.HideCamera(); Game.Instance.uiManager.CloseUI(); //暂停语音和文字 Game.Instance.uiManager.CloseUI(); Game.Instance.sound.StopBGM(); } /// /// 图片关闭事件监听 /// private void OnCloseImageEvent(CloseImageEvent e) { //暂停语音和文字 Game.Instance.uiManager.CloseUI(); Game.Instance.sound.StopBGM(); //判断是否要触发下一步骤 if (e.id == gameModel.GetId()) { //显示子模块按钮高亮 HighLightSubBtn(gameModel.GetId()); //全局id自增 if (gameModel.IsCanAddIDSelf()) { gameModel.AddId(); if (gameModel.mainData.GetTriggerType(gameModel.GetId()) == "自动") { OnMessageType( (EventType)Enum.Parse(typeof(EventType), gameModel.mainData.GetMessageType(gameModel.GetId())) , gameModel.GetId()); } else if (gameModel.mainData.GetTriggerType(gameModel.GetId()) == "手动") { ShowTipText(gameModel.GetId());//提示 HighLightToolBtn(gameModel.GetId());//高亮 } } } } /// /// 子模块事件监听 /// private void OnWorkBtnClipEvent(WorkBtnClipEvent e) { //重置动画 clipManagerCurrent = GetClipManager(gameModel.mainData.GetClipManager(e.id)); clipManagerCurrent?.ResetClip(); //重置点击 modelClick?.HideModel(); OnMessageType(e.type,e.id); } /// /// 关闭习题事件监听 /// private void OnCloseQuestionEvent(CloseQuestionEvent e) { //全局id自增 if (gameModel.IsCanAddIDSelf()) { gameModel.AddId(); if (gameModel.mainData.GetTriggerType(gameModel.GetId()) == "自动") { OnMessageType( (EventType)Enum.Parse(typeof(EventType), gameModel.mainData.GetMessageType(gameModel.GetId())) , gameModel.GetId()); } else if (gameModel.mainData.GetTriggerType(gameModel.GetId()) == "手动") { ShowTipText(gameModel.GetId());//提示 HighLightToolBtn(gameModel.GetId());//工具高亮 } } } private void OnMessageType(EventType type, int id) { if (id == 0) return; switch (type) { case EventType.开始: OnInit(); break; case EventType.动画: OnPlayClip(); break; case EventType.图片: OnImage(id); break; case EventType.展示: OnModelShow(id); break; case EventType.习题: OnQuestion(); break; case EventType.点击: OnModelClick(id); break; case EventType.拖拽: OnModelDrag(id); break; case EventType.操作: break; case EventType.结束: OnFinish(); break; } } private void OnInit() { clipManagerShowOneBase.ShowModel(gameModel.mainData.GetClipManager(gameModel.GetId()));//显示ClipManager模型 Game.Instance.uiManager.ShowUI(null, gameModel.mainData.GetSoundText(gameModel.GetId()));//文字 PlaySound(gameModel.GetId());//语音 if (gameModel.IsCanAddIDSelf()) { gameModel.AddId(); if (gameModel.mainData.GetTriggerType(gameModel.GetId()) == "自动") { OnMessageType( (EventType)Enum.Parse(typeof(EventType), gameModel.mainData.GetMessageType(gameModel.GetId())) , gameModel.GetId()); } else if (gameModel.mainData.GetTriggerType(gameModel.GetId()) == "手动") { ShowTipText(gameModel.GetId());//提示 HighLightToolBtn(gameModel.GetId());//高亮 } } } private void OnImage(int value) { Game.Instance.uiManager.ShowUI(null, value); } private void OnModelShow(int value) { float clipLength = 0; //隐藏UI HideUI(); Game.Instance.uiManager.CloseUI(); //模型 modelShow?.ShowModel(gameModel.mainData.GetModelShowPath(value)); //动画 clipManagerCurrent = GetClipManager(gameModel.mainData.GetClipManager(value)); if (clipManagerCurrent) { clipLength = clipManagerCurrent.PlayClip(gameModel.mainData.GetClipPath(value)); } if (gameModel.GetModeType() == ModeType.LiuLan) { //文字 ShowSpeakText(value); //语音 PlaySound(value); } //展示UI ShowUI(clipLength, () => { Game.Instance.uiManager.ShowUI(); modelShow?.ShowCamera(); }); } private void OnModelDrag(int value) { //todo } private void OnPlayClip() { float clipLength = 0; float audioLength = 0; //重置动画 clipManagerCurrent = GetClipManager(gameModel.mainData.GetClipManager(gameModel.GetId())); clipManagerCurrent?.ResetClip(); //隐藏UI HideUI(); //动画 clipManagerCurrent = GetClipManager(gameModel.mainData.GetClipManager(gameModel.GetId())); if (clipManagerCurrent) { clipLength = clipManagerCurrent.PlayClip(gameModel.mainData.GetClipPath(gameModel.GetId())); } if (gameModel.GetModeType() == ModeType.LiuLan) { //文字 ShowSpeakText(gameModel.GetId()); //语音 audioLength = PlaySound(gameModel.GetId()); } //语音和动画的长度比较 float t = CompareLength(audioLength, clipLength); //显示UI ShowUI(t, () => { //记录步骤 if (gameModel.GetModeType() == ModeType.KaoHe) { OnStepRecordEvent(new StepRecordEvent() { subModule = gameModel.mainData.GetSubModuleName(gameModel.GetId()), task = gameModel.mainData.GetTaskName(gameModel.GetId()) , start = false}); } //显示子模块按钮高亮 HighLightSubBtn(gameModel.GetId()); //全局id自增 if (gameModel.IsCanAddIDSelf()) { gameModel.AddId(); if (gameModel.mainData.GetTriggerType(gameModel.GetId()) == "自动") { OnMessageType( (EventType)Enum.Parse(typeof(EventType), gameModel.mainData.GetMessageType(gameModel.GetId())) , gameModel.GetId()); } else if (gameModel.mainData.GetTriggerType(gameModel.GetId()) == "手动") { ShowTipText(gameModel.GetId());//提示 HighLightToolBtn(gameModel.GetId());//高亮 } } }); } private void OnModelClick(int value) { modelClick?.ShowModel(gameModel.mainData.GetModelClickPath(value)); if (targetToScreen) { targetToScreen.targetTransform = modelClick.GetModel(gameModel.mainData.GetModelClickPath(value)).transform; } } private void OnQuestion() { Game.Instance.uiManager.ShowUI(null,gameModel.mainData.GetQuestionGroup(gameModel.GetId())); } private void OnFinish() { if(gameModel.GetModeType() == ModeType.KaoHe) { Game.Instance.uiManager.ShowUI(null,resultManager.ToList()); } else { Game.Instance.uiManager.ShowUI(null, gameModel.mainData.GetSoundText(gameModel.GetId()));//文字 } PlaySound(gameModel.GetId());//语音 } void ShowSpeakText(int value) { string speakText = gameModel.mainData.GetSoundText(value); if (!string.IsNullOrEmpty(speakText)) { Game.Instance.uiManager.ShowUI(null, speakText); } } void ShowTipText(int value) { string tipText = gameModel.mainData.GetTip(value); if (!string.IsNullOrEmpty(tipText)) { Game.Instance.uiManager.ShowUI(null, tipText); } } float PlaySound(int value) { string audioPath = gameModel.mainData.GetSoundPath(value); if (!string.IsNullOrEmpty(audioPath)) { Game.Instance.sound.PlayBGM(audioPath, false); AudioClip ac = Resources.Load(Game.Instance.soundDirPath + "/" + audioPath); return ac ? ac.length : 0; } return 0; } AClipManager GetClipManager(string value) { if (clipManagerArray.Length == 0) return null; for (int i = 0; i < clipManagerArray.Length; i++) { if(clipManagerArray[i].name == value) { return clipManagerArray[i]; } } return null; } void HighLightToolBtn(int value) { if (gameModel.GetModeType() == ModeType.LiuLan) { Game.Instance.uiManager.GetUI().HighLightBtn(gameModel.mainData.GetToolName(value)); } } void HighLightSubBtn(int value) { Game.Instance.uiManager.GetUI().HighLightBtn(gameModel.mainData.GetSubModuleName(value)); } void HideUI() { Game.Instance.uiManager.CloseUI(); Game.Instance.uiManager.CloseUI(); Game.Instance.uiManager.CloseUI(); Game.Instance.uiManager.CloseUI(); } float CompareLength(float ac, float pd) { return ac > pd ? ac : pd; } void ShowUI(float t = 0,UnityAction callBack = null) { StartCoroutine(DelayExecute(t, () => { Game.Instance.uiManager.ShowUI(); Game.Instance.uiManager.ShowUI(); Game.Instance.uiManager.ShowUI(); callBack?.Invoke(); })); } IEnumerator DelayExecute(float value,UnityAction callback) { yield return new WaitForSeconds(value); callback?.Invoke(); } public void StartTimeCounter() { if (timeCounterManager == null) return; //开始记录时间 timeCounterManager.StartTimeCounter((str) => { Game.Instance.uiManager.GetUI().timeText.text = str; }); } void StopTimeCounter(bool clear) { if (timeCounterManager == null) return; timeCounterManager.StopTimeCounter();//停止记录时间 if (clear) { //清除时间记录 timeCounterManager.ClearTimeCounter(); Game.Instance.uiManager.GetUI().timeText.text = timeCounterManager.GetTime(); } } /// /// 记录成绩事件 /// private void OnScoreRecordEvent(ScoreRecordEvent e) { if (scoreManager == null) return; if (e.right) { Game.Instance.sound.PlayBGM("right", false); } else { Game.Instance.sound.PlayBGM("false", false); } scoreManager.SetScore(e.subModule,e.task, e.right, gameModel.mainData.GetScoreMode(gameModel.GetId())); Game.Instance.uiManager.GetUI().scoreText.text = scoreManager.GetTotalScore().ToString(); } /// /// 进度事件监听 /// private void OnProcessEvent(ProcessEvent e) { if (processManager == null) return; processManager.SetProcess(e.subModule,e.task); Game.Instance.uiManager.GetUI().processText.text = processManager.GetProcess() + "%"; } /// /// 步骤记录事件监听 /// private void OnStepRecordEvent(StepRecordEvent e) { if (resultManager == null) return; if (scoreManager == null) return; if (e.start) { resultManager.StartStep( e.subModule, e.task, 30, e.stepType, e.answer, e.yourAnswer ); } else { resultManager.EndStep( e.subModule, e.task, scoreManager.GetScore(e.subModule,e.task), scoreManager.GetStepMaxScore(e.subModule,e.task), scoreManager.GetModeRemark(e.subModule,e.task), e.yourAnswer ); } gameModel.SetListStep(resultManager.ToList()); } private void OnDestroy() { Game.Instance.eventManager.RemoveListener(OnCloseModelEvent); Game.Instance.eventManager.RemoveListener(OnWorkBtnClipEvent); Game.Instance.eventManager.RemoveListener(OnImageChangeEvent); Game.Instance.eventManager.RemoveListener(OnCloseImageEvent); Game.Instance.eventManager.RemoveListener(OnHomeEvent); Game.Instance.eventManager.RemoveListener(OnCloseQuestionEvent); Game.Instance.eventManager.RemoveListener(OnMessageTypeEvent); Game.Instance.eventManager.RemoveListener(OnScoreRecordEvent); Game.Instance.eventManager.RemoveListener(OnProcessEvent); Game.Instance.eventManager.RemoveListener(OnStepRecordEvent); } }