using UnityEngine; using UnityEngine.UI; using TMPro; using System.Collections.Generic; using System.Linq; using SK.Framework; using Microsoft.MixedReality.Toolkit.OpenVR.Headers; public class QuizSystem : MonoBehaviour { [Header("UI References")] public TextMeshProUGUI questionText; public ToggleGroup toggleGroup; public Toggle[] optionToggles; public TextMeshProUGUI[] optionTexts; public Button confirmButton; public Button nextButton; public TextMeshProUGUI explanationText; public GameObject explanationPanel; [Header("Question Data")] public QuestionsProfile judgeProfile; // 判断题资源 public QuestionsProfile singleProfile; // 单选题资源 private List allQuestions = new List(); public int currentQuestionIndex = 0; private bool isJudgeQuestion = false; void Awake() { SetupUI(); } void OnEnable() { currentQuestionIndex = 0; allQuestions.Clear(); isJudgeQuestion = false; InitializeQuiz(); LoadNextQuestion(); confirmButton.gameObject.SetActive(true); nextButton.gameObject.SetActive(false); explanationPanel.SetActive(false); toggleGroup.SetAllTogglesOff(); overBtn.gameObject.SetActive(false); } void InitializeQuiz() { // 从判断题资源中随机选择5个 if (judgeProfile != null && judgeProfile.Judges != null && judgeProfile.Judges.Count > 0) { var randomJudgeQuestions = judgeProfile.Judges .OrderBy(x => Random.value) .Take(5) .Cast() .ToList(); allQuestions.AddRange(randomJudgeQuestions); } // 从单选题资源中随机选择10个 if (singleProfile != null && singleProfile.SingleChoices != null && singleProfile.SingleChoices.Count > 0) { var randomSingleQuestions = singleProfile.SingleChoices .OrderBy(x => Random.value) .Take(10) .Cast() .ToList(); allQuestions.AddRange(randomSingleQuestions); } Debug.Log($"总共加载了 {allQuestions.Count} 道题目"); } void SetupUI() { confirmButton.onClick.AddListener(OnConfirmButtonClick); nextButton.onClick.AddListener(OnNextButtonClick); // 初始状态 confirmButton.gameObject.SetActive(true); nextButton.gameObject.SetActive(false); explanationPanel.SetActive(false); // 设置Toggle Group foreach (var toggle in optionToggles) { toggle.group = toggleGroup; toggle.onValueChanged.AddListener(OnToggleValueChanged); } } void LoadNextQuestion() { if (currentQuestionIndex >= allQuestions.Count) { // 所有题目完成 ShowQuizComplete(); return; } // 重置UI状态 toggleGroup.SetAllTogglesOff(); explanationPanel.SetActive(false); confirmButton.gameObject.SetActive(true); nextButton.gameObject.SetActive(false); confirmButton.interactable = false; var currentQuestion = allQuestions[currentQuestionIndex]; // 判断题目类型 isJudgeQuestion = currentQuestion is JudgeQuestion; // 显示题目 questionText.text = $"{currentQuestionIndex + 1}/15. {currentQuestion.Question}"; // 设置选项 SetupOptions(currentQuestion); // 隐藏未使用的选项 UpdateOptionVisibility(); } void SetupOptions(QuestionBase question) { if (question is SingleChoiceQuestion singleQuestion) { // 单选题:显示所有选项 for (int i = 0; i < optionTexts.Length; i++) { if (i < singleQuestion.Choices.Count) { optionTexts[i].text = $"{(char)('A' + i)}. {singleQuestion.Choices[i].text}"; optionToggles[i].gameObject.SetActive(true); } else { optionToggles[i].gameObject.SetActive(false); } } } else if (question is JudgeQuestion judgeQuestion) { // 判断题:只显示正确和错误两个选项 optionTexts[0].text = $"A. {judgeQuestion.Positive}"; optionTexts[1].text = $"B. {judgeQuestion.Negative}"; // 前两个选项显示,后两个隐藏 for (int i = 0; i < optionToggles.Length; i++) { optionToggles[i].gameObject.SetActive(i < 2); } } } void UpdateOptionVisibility() { // 根据题目类型更新选项显示 if (isJudgeQuestion) { // 判断题只显示前两个选项 for (int i = 0; i < optionToggles.Length; i++) { optionToggles[i].gameObject.SetActive(i < 2); } } else { // 单选题显示所有有内容的选项 var singleQuestion = allQuestions[currentQuestionIndex] as SingleChoiceQuestion; if (singleQuestion != null) { for (int i = 0; i < optionToggles.Length; i++) { optionToggles[i].gameObject.SetActive(i < singleQuestion.Choices.Count); } } } } void OnToggleValueChanged(bool isOn) { // 只要有选项被选中,确定按钮就可交互 confirmButton.interactable = toggleGroup.AnyTogglesOn(); } void OnConfirmButtonClick() { if (!toggleGroup.AnyTogglesOn()) return; // 获取选中的Toggle Toggle selectedToggle = toggleGroup.ActiveToggles().FirstOrDefault(); if (selectedToggle == null) return; // 获取选中的索引 int selectedIndex = System.Array.IndexOf(optionToggles, selectedToggle); // 显示解析 ShowExplanation(selectedIndex); // 切换按钮状态 confirmButton.gameObject.SetActive(false); nextButton.gameObject.SetActive(true); } void ShowExplanation(int selectedIndex) { var currentQuestion = allQuestions[currentQuestionIndex]; string explanation = currentQuestion.Analysis; // 检查答案是否正确 bool isCorrect = false; if (currentQuestion is SingleChoiceQuestion singleQuestion) { isCorrect = selectedIndex == singleQuestion.Answer; } else if (currentQuestion is JudgeQuestion judgeQuestion) { // 判断题:索引0对应正确(true),索引1对应错误(false) bool userAnswer = selectedIndex == 0; isCorrect = userAnswer == judgeQuestion.Answer; } // 显示解析 explanationText.text = $"{(isCorrect ? "回答正确!" : "回答错误!")}\n\n解析:{explanation}"; explanationPanel.SetActive(true); } void OnNextButtonClick() { currentQuestionIndex++; LoadNextQuestion(); } public Button overBtn; void ShowQuizComplete() { questionText.text = "答题完成!"; // 隐藏所有选项 foreach (var toggle in optionToggles) { toggle.gameObject.SetActive(false); } confirmButton.gameObject.SetActive(false); nextButton.gameObject.SetActive(false); explanationPanel.SetActive(false); overBtn.gameObject.SetActive(true); } void OnDestroy() { // 清理事件监听 confirmButton.onClick.RemoveListener(OnConfirmButtonClick); nextButton.onClick.RemoveListener(OnNextButtonClick); foreach (var toggle in optionToggles) { toggle.onValueChanged.RemoveListener(OnToggleValueChanged); } } // 重置答题系统 void ResetQuiz() { currentQuestionIndex = 0; allQuestions.Clear(); InitializeQuiz(); LoadNextQuestion(); } void OnDisable() { currentQuestionIndex = 0; } }