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等
}
}