123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334 |
- using UnityEngine;
- using UnityEngine.UI;
- using TMPro;
- using System.Collections;
- public class QuizUIManager : MonoBehaviour
- {
- // 题库管理器
- public QuestionManager questionManager;
- // 题目文本
- public TextMeshProUGUI questionText;
- // 选项A按钮
- public Button optionAButton;
- // 选项B按钮
- public Button optionBButton;
- // 选项A文本
- public TextMeshProUGUI optionAText;
- // 选项B文本
- public TextMeshProUGUI optionBText;
- // 答题反馈文本
- public TextMeshProUGUI feedbackText;
- // 进度条
- public Slider progressBar;
- // 答案窗口
- public GameObject answerWindow; // 添加对 Answer Window 的引用
- // 开始战斗按钮
- public Button startBattleButton; // 添加对 Start Battle 按钮的引用
- // 是否允许答题
- private bool canAnswer = true;
- // 答案窗口CanvasGroup(用于淡入淡出)
- private CanvasGroup answerWindowCanvasGroup;
- // 淡入淡出持续时间
- private float fadeDuration = 1.5f; // 淡入淡出持续时间
- /// <summary>
- /// 初始化答案窗口CanvasGroup
- /// </summary>
- void Awake()
- {
- Debug.Log("QuizUIManager Awake");
- if (answerWindow != null)
- {
- answerWindowCanvasGroup = answerWindow.GetComponent<CanvasGroup>();
- if (answerWindowCanvasGroup == null)
- {
- answerWindowCanvasGroup = answerWindow.AddComponent<CanvasGroup>();
- }
- // 初始设置为完全透明且不可交互
- answerWindowCanvasGroup.alpha = 0f;
- answerWindowCanvasGroup.interactable = false;
- answerWindowCanvasGroup.blocksRaycasts = false;
- }
- }
- /// <summary>
- /// 启动时检查组件并注册按钮事件
- /// </summary>
- void Start()
- {
- Debug.Log("QuizUIManager Start");
-
- // 检查所有必要组件
- if (questionManager == null)
- {
- Debug.LogError("QuestionManager 未设置!请在 Inspector 中设置 QuestionManager 引用");
- return;
- }
-
- if (questionText == null)
- {
- Debug.LogError("questionText 未设置!请在 Inspector 中设置 Question Text 引用");
- return;
- }
-
- if (optionAButton == null || optionBButton == null)
- {
- Debug.LogError("选项按钮未设置!请在 Inspector 中设置 Option A/B Button 引用");
- return;
- }
-
- if (optionAText == null || optionBText == null)
- {
- Debug.LogError("选项文本未设置!请在 Inspector 中设置 Option A/B Text 引用");
- return;
- }
- // 添加按钮监听
- optionAButton.onClick.AddListener(() => OnAnswerSelected(true));
- optionBButton.onClick.AddListener(() => OnAnswerSelected(false));
-
- // 显示第一道题
- // Invoke("DisplayCurrentQuestion", 0.1f);
- // 稍微延迟一下,确保 QuestionManager 已经初始化
- if (startBattleButton != null)
- {
- startBattleButton.onClick.AddListener(OnStartBattleClicked);
- }
- }
- /// <summary>
- /// 开始战斗按钮点击,延迟显示答题窗口
- /// </summary>
- void OnStartBattleClicked()
- {
- // 禁用开始战斗按钮,防止重复点击
- if (startBattleButton != null)
- {
- startBattleButton.interactable = false;
- }
- // 3秒后显示答题窗口
- Invoke("ShowAnswerWindow", 3f);
- }
- /// <summary>
- /// 显示答题窗口并淡入
- /// </summary>
- void ShowAnswerWindow()
- {
- if (answerWindow != null)
- {
- answerWindow.SetActive(true);
- //DisplayCurrentQuestion();
- StartCoroutine(FadeIn()); // 使用协程来实现淡入效果
- }
- }
- /// <summary>
- /// 答案窗口淡入协程
- /// </summary>
- IEnumerator FadeIn()
- {
- float elapsedTime = 0f;
-
- // 确保窗口可见但完全透明
- answerWindowCanvasGroup.alpha = 0f;
- answerWindowCanvasGroup.interactable = true;
- answerWindowCanvasGroup.blocksRaycasts = true;
- // 逐渐增加透明度
- while (elapsedTime < fadeDuration)
- {
- elapsedTime += Time.deltaTime;
- float newAlpha = Mathf.Lerp(0f, 1f, elapsedTime / fadeDuration);
- answerWindowCanvasGroup.alpha = newAlpha;
- yield return null;
- }
- // 确保完全显示
- answerWindowCanvasGroup.alpha = 1f;
-
- // 显示第一道题
- DisplayCurrentQuestion();
- }
- /// <summary>
- /// 隐藏答题窗口并淡出
- /// </summary>
- public void HideAnswerWindow()
- {
- if (answerWindow != null)
- {
- StartCoroutine(FadeOut());
- }
- }
- /// <summary>
- /// 答案窗口淡出协程
- /// </summary>
- IEnumerator FadeOut()
- {
- float elapsedTime = 0f;
-
- // 逐渐减少透明度
- while (elapsedTime < fadeDuration)
- {
- elapsedTime += Time.deltaTime;
- float newAlpha = Mathf.Lerp(1f, 0f, elapsedTime / fadeDuration);
- answerWindowCanvasGroup.alpha = newAlpha;
- yield return null;
- }
- // 完全隐藏窗口
- answerWindowCanvasGroup.alpha = 0f;
- answerWindowCanvasGroup.interactable = false;
- answerWindowCanvasGroup.blocksRaycasts = false;
- answerWindow.SetActive(false);
- }
- /// <summary>
- /// 显示当前题目和选项,刷新UI
- /// </summary>
- void DisplayCurrentQuestion()
- {
- Debug.Log("显示新题目");
- if (questionManager == null)
- {
- Debug.LogError("QuestionManager 为空!");
- return;
- }
- QuestionData currentQuestion = questionManager.GetCurrentQuestion();
- if (currentQuestion != null)
- {
- Debug.Log($"当前题目:{currentQuestion.multiplier1} × {currentQuestion.multiplier2}");
-
- // 显示题目
- if (questionText != null)
- {
- questionText.text = $"{currentQuestion.multiplier1} × {currentQuestion.multiplier2} = ?";
- }
- else
- {
- Debug.LogError("questionText 为空!");
- }
-
- // 根据 isAnswerA 决定正确答案的位置
- if (currentQuestion.isAnswerA)
- {
- if (optionAText != null && optionBText != null)
- {
- optionAText.text = currentQuestion.result.ToString();
- optionBText.text = currentQuestion.wrongAnswer.ToString();
- }
- }
- else
- {
- if (optionAText != null && optionBText != null)
- {
- optionAText.text = currentQuestion.wrongAnswer.ToString();
- optionBText.text = currentQuestion.result.ToString();
- }
- }
- // 重置UI状态
- if (feedbackText != null)
- {
- feedbackText.text = "";
- }
-
- canAnswer = true;
- if (optionAButton != null && optionBButton != null)
- {
- optionAButton.interactable = true;
- optionBButton.interactable = true;
- }
-
- if (progressBar != null)
- {
- progressBar.value = questionManager.GetProgress();
- }
- }
- else
- {
- Debug.LogError("获取当前题目失败!currentQuestion 为空");
- }
- }
- /// <summary>
- /// 选项按钮点击,判断答案并反馈
- /// </summary>
- /// <param name="selectedA">是否选择A</param>
- void OnAnswerSelected(bool selectedA)
- {
- if (!canAnswer) return;
- canAnswer = false;
- bool isCorrect = questionManager.CheckAnswer(selectedA);
-
- // 禁用按钮防止重复点击
- optionAButton.interactable = false;
- optionBButton.interactable = false;
- // 显示答题结果
- feedbackText.text = isCorrect ? "回答正确!" : "回答错误!";
-
- // 设置按钮颜色反馈
- SetButtonColor(optionAButton, selectedA ? isCorrect : false);
- SetButtonColor(optionBButton, !selectedA ? isCorrect : false);
- // 延迟进入下一题
- Invoke("ProceedToNextQuestion", 0.5f);
- }
- /// <summary>
- /// 设置按钮颜色反馈
- /// </summary>
- /// <param name="button">按钮</param>
- /// <param name="isCorrect">是否正确</param>
- void SetButtonColor(Button button, bool isCorrect)
- {
- ColorBlock colors = button.colors;
- colors.normalColor = isCorrect ? Color.green : Color.red;
- colors.selectedColor = colors.normalColor;
- button.colors = colors;
- }
- /// <summary>
- /// 进入下一题,重置按钮颜色并刷新题目
- /// </summary>
- void ProceedToNextQuestion()
- {
- // 重置按钮颜色
- ResetButtonColors();
- questionManager.NextQuestion();
- DisplayCurrentQuestion();
- }
- /// <summary>
- /// 重置按钮颜色为默认
- /// </summary>
- void ResetButtonColors()
- {
- ColorBlock defaultColors = new ColorBlock
- {
- normalColor = Color.white,
- highlightedColor = new Color(0.9f, 0.9f, 0.9f),
- pressedColor = new Color(0.8f, 0.8f, 0.8f),
- selectedColor = Color.white,
- disabledColor = new Color(0.8f, 0.8f, 0.8f, 0.5f),
- colorMultiplier = 1f,
- fadeDuration = 0.1f
- };
- optionAButton.colors = defaultColors;
- optionBButton.colors = defaultColors;
- }
- void OnDisable()
- {
- CancelInvoke(); // 取消所有Invoke,防止场景重载后自动触发ShowAnswerWindow等
- }
- }
|