QingGangLongGu/Assets/_Scripts/Application/LiaoNingJiaoZhuanLauncher.cs
2025-03-11 15:30:07 +08:00

534 lines
19 KiB
C#

using System;
using System.Collections;
using UnityEngine;
using UnityEngine.Events;
using ZXKFramework;
//辽宁交专
public class LiaoNingJiaoZhuanLauncher : MonoSingleton<LiaoNingJiaoZhuanLauncher>
{
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<Transform>("ClipManager"));
clipManagerArray = GetComponentsInChildren<AClipManager>(true);
if(clipManagerArray.Length > 0)
{
for (int i = 0; i < clipManagerArray.Length; i++)
{
clipManagerArray[i]?.Init();
}
}
modelShow = GetComponentInChildren<ModelShowManager>(true);
modelShow?.Init();
modelClick = GetComponentInChildren<ModelClickManager>(true);
modelClick?.Init();
playerMovement = GetComponentInChildren<PlayerMovement>(true);
targetToScreen = GetComponentInChildren<TargetToScreen>(true);
timeCounterManager = GetComponentInChildren<TimeCounterManager>(true);
scoreManager = GetComponentInChildren<ScoreManager>(true);
scoreManager?.Init();
processManager = GetComponentInChildren<ProcessManager>(true);
processManager?.Init();
resultManager = GetComponentInChildren<ResultManager>(true);
resultManager?.Init();
netManager = GetComponentInChildren<NetManager>(true);
netManager?.Init();
}
void Start()
{
MVC.RegisterModel(new GameModel());
gameModel = MVC.GetModel<GameModel>();
gameModel.Init();
Game.Instance.eventManager.AddListener<CloseModelEvent>(OnCloseModelEvent);
Game.Instance.eventManager.AddListener<WorkBtnClipEvent>(OnWorkBtnClipEvent);
Game.Instance.eventManager.AddListener<ImageChangeEvent>(OnImageChangeEvent);
Game.Instance.eventManager.AddListener<CloseImageEvent>(OnCloseImageEvent);
Game.Instance.eventManager.AddListener<HomeEvent>(OnHomeEvent);
Game.Instance.eventManager.AddListener<CloseQuestionEvent>(OnCloseQuestionEvent);
Game.Instance.eventManager.AddListener<MessageTypeEvent>(OnMessageTypeEvent);
Game.Instance.eventManager.AddListener<ScoreRecordEvent>(OnScoreRecordEvent);
Game.Instance.eventManager.AddListener<ProcessEvent>(OnProcessEvent);
Game.Instance.eventManager.AddListener<StepRecordEvent>(OnStepRecordEvent);
//切换到开始状态
Game.Instance.fsm.ChangeState<WelcomeState>();
}
/// <summary>
/// 事件类型事件监听
/// </summary>
private void OnMessageTypeEvent(MessageTypeEvent e)
{
OnMessageType(e.type,e.id);
}
/// <summary>
/// 返回主页事件监听
/// </summary>
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<WelcomeState>();
}else if (e.type == "Mode")
{
gameModel.SetId(gameModel.mainData.GetMinId(gameModel.mainData.GetModuleName(gameModel.GetId())));
Game.Instance.fsm.ChangeState<ModeSelectionState>();
}
if (gameModel.GetModeType() == ModeType.KaoHe)
{
StopTimeCounter(false);
netManager?.SendData(resultManager?.ToJson());
}
}
/// <summary>
/// 图片切换事件监听
/// </summary>
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<SpeakText>(null, speakText);
}
string audioPath = gameModel.imageData.GetImageSoundPath(e.id);
if (!string.IsNullOrEmpty(audioPath))
{
Game.Instance.sound.PlayBGM(audioPath, false);
}
}
}
/// <summary>
/// 关闭模型事件监听
/// </summary>
private void OnCloseModelEvent(CloseModelEvent e)
{
modelShow?.HideModel();
modelShow?.HideCamera();
Game.Instance.uiManager.CloseUI<ModelShowPanel>();
//暂停语音和文字
Game.Instance.uiManager.CloseUI<SpeakText>();
Game.Instance.sound.StopBGM();
}
/// <summary>
/// 图片关闭事件监听
/// </summary>
private void OnCloseImageEvent(CloseImageEvent e)
{
//暂停语音和文字
Game.Instance.uiManager.CloseUI<SpeakText>();
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());//高亮
}
}
}
}
/// <summary>
/// 子模块事件监听
/// </summary>
private void OnWorkBtnClipEvent(WorkBtnClipEvent e)
{
//重置动画
clipManagerCurrent = GetClipManager(gameModel.mainData.GetClipManager(e.id));
clipManagerCurrent?.ResetClip();
//重置点击
modelClick?.HideModel();
OnMessageType(e.type,e.id);
}
/// <summary>
/// 关闭习题事件监听
/// </summary>
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<InitPanel>(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<ImagePanel>(null, value);
}
private void OnModelShow(int value)
{
float clipLength = 0;
//隐藏UI
HideUI();
Game.Instance.uiManager.CloseUI<ModelShowPanel>();
//模型
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<ModelShowPanel>();
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<Question_ChoicePanel>(null,gameModel.mainData.GetQuestionGroup(gameModel.GetId()));
}
private void OnFinish()
{
if(gameModel.GetModeType() == ModeType.KaoHe)
{
Game.Instance.uiManager.ShowUI<DetailsPanel>(null,resultManager.ToList());
}
else
{
Game.Instance.uiManager.ShowUI<FinishPanel>(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<SpeakText>(null, speakText);
}
}
void ShowTipText(int value)
{
string tipText = gameModel.mainData.GetTip(value);
if (!string.IsNullOrEmpty(tipText))
{
Game.Instance.uiManager.ShowUI<Tip>(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<AudioClip>(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<ToolPanel>().HighLightBtn(gameModel.mainData.GetToolName(value));
}
}
void HighLightSubBtn(int value)
{
Game.Instance.uiManager.GetUI<WorkBtn>().HighLightBtn(gameModel.mainData.GetSubModuleName(value));
}
void HideUI()
{
Game.Instance.uiManager.CloseUI<Tip>();
Game.Instance.uiManager.CloseUI<ToolPanel>();
Game.Instance.uiManager.CloseUI<WorkBtn>();
Game.Instance.uiManager.CloseUI<Result>();
}
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<ToolPanel>();
Game.Instance.uiManager.ShowUI<WorkBtn>();
Game.Instance.uiManager.ShowUI<Result>();
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<Result>().timeText.text = str;
});
}
void StopTimeCounter(bool clear)
{
if (timeCounterManager == null) return;
timeCounterManager.StopTimeCounter();//停止记录时间
if (clear)
{
//清除时间记录
timeCounterManager.ClearTimeCounter();
Game.Instance.uiManager.GetUI<Result>().timeText.text = timeCounterManager.GetTime();
}
}
/// <summary>
/// 记录成绩事件
/// </summary>
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<Result>().scoreText.text = scoreManager.GetTotalScore().ToString();
}
/// <summary>
/// 进度事件监听
/// </summary>
private void OnProcessEvent(ProcessEvent e)
{
if (processManager == null) return;
processManager.SetProcess(e.subModule,e.task);
Game.Instance.uiManager.GetUI<Result>().processText.text = processManager.GetProcess() + "%";
}
/// <summary>
/// 步骤记录事件监听
/// </summary>
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<CloseModelEvent>(OnCloseModelEvent);
Game.Instance.eventManager.RemoveListener<WorkBtnClipEvent>(OnWorkBtnClipEvent);
Game.Instance.eventManager.RemoveListener<ImageChangeEvent>(OnImageChangeEvent);
Game.Instance.eventManager.RemoveListener<CloseImageEvent>(OnCloseImageEvent);
Game.Instance.eventManager.RemoveListener<HomeEvent>(OnHomeEvent);
Game.Instance.eventManager.RemoveListener<CloseQuestionEvent>(OnCloseQuestionEvent);
Game.Instance.eventManager.RemoveListener<MessageTypeEvent>(OnMessageTypeEvent);
Game.Instance.eventManager.RemoveListener<ScoreRecordEvent>(OnScoreRecordEvent);
Game.Instance.eventManager.RemoveListener<ProcessEvent>(OnProcessEvent);
Game.Instance.eventManager.RemoveListener<StepRecordEvent>(OnStepRecordEvent);
}
}