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; // 淡入淡出持续时间 /// /// 初始化答案窗口CanvasGroup /// void Awake() { Debug.Log("QuizUIManager Awake"); if (answerWindow != null) { answerWindowCanvasGroup = answerWindow.GetComponent(); if (answerWindowCanvasGroup == null) { answerWindowCanvasGroup = answerWindow.AddComponent(); } // 初始设置为完全透明且不可交互 answerWindowCanvasGroup.alpha = 0f; answerWindowCanvasGroup.interactable = false; answerWindowCanvasGroup.blocksRaycasts = false; } } /// /// 启动时检查组件并注册按钮事件 /// 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); } } /// /// 开始战斗按钮点击,延迟显示答题窗口 /// void OnStartBattleClicked() { // 禁用开始战斗按钮,防止重复点击 if (startBattleButton != null) { startBattleButton.interactable = false; } // 3秒后显示答题窗口 Invoke("ShowAnswerWindow", 3f); } /// /// 显示答题窗口并淡入 /// void ShowAnswerWindow() { if (answerWindow != null) { answerWindow.SetActive(true); //DisplayCurrentQuestion(); StartCoroutine(FadeIn()); // 使用协程来实现淡入效果 } } /// /// 答案窗口淡入协程 /// 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(); } /// /// 隐藏答题窗口并淡出 /// public void HideAnswerWindow() { if (answerWindow != null) { StartCoroutine(FadeOut()); } } /// /// 答案窗口淡出协程 /// 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); } /// /// 显示当前题目和选项,刷新UI /// 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 为空"); } } /// /// 选项按钮点击,判断答案并反馈 /// /// 是否选择A 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); } /// /// 设置按钮颜色反馈 /// /// 按钮 /// 是否正确 void SetButtonColor(Button button, bool isCorrect) { ColorBlock colors = button.colors; colors.normalColor = isCorrect ? Color.green : Color.red; colors.selectedColor = colors.normalColor; button.colors = colors; } /// /// 进入下一题,重置按钮颜色并刷新题目 /// void ProceedToNextQuestion() { // 重置按钮颜色 ResetButtonColors(); questionManager.NextQuestion(); DisplayCurrentQuestion(); } /// /// 重置按钮颜色为默认 /// 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等 } }