一:前言
首先要感谢周周的Unity小屋大佬,原文链接如下
在此基础上增加了一些功能,使其比较完善
二:功能说明
通过xml文件写入问题答案和解析,点击开始答题进入答题界面,在规定时间内答题,倒计时结束,自动关闭答题界面,显示结束界面和得分,倒计时未结束,可以答题,答过的题不可二次修改,点击下方的小点按钮,选择对应的题目,题目选择完毕后,下方按钮也有对应标识,不可再次点击。
程序运行如下:

三:UI界面介绍
1.开始界面

2.答题界面

答题界面与周周的Unity小屋布置的框架一样,注意预制体,xml文件的位置等。添加了得分,倒计时等。
3.结束界面

4.提示界面

四:代码书写
-
选项预制体代码Options
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Options : MonoBehaviour
{
/// <summary>
/// 当前选项组件
/// </summary>
public Toggle thisToggle;
/// <summary>
/// 选项的内容文本
/// </summary>
public Text optionText;
/// <summary>
/// 选项对应的分数
/// </summary>
public int score;
/// <summary>
/// 选项的状态
/// </summary>
public bool IsSelect = false;
public void Init(AnswerData answerData)
{
optionText.text = answerData.option;
score = answerData.Score;
thisToggle.onValueChanged.AddListener((isSelect) => { IsSelect =isSelect; });
}
}
这个脚本挂载上option预制体上,吧对应的内容拖到对应位置即可。
-
Panel_Question、ButtonItem、DataPath
using System;
using System.Collections;
using System.Collections.Generic;
using System.Xml;
using System.Xml.Linq;
using UnityEngine;
using UnityEngine.UI;
public class Panel_Question : MonoBehaviour
{
[Header("root界面:开始界面的root 答题界面的root 结束界面的root 提示界面的root")]
[SerializeField] GameObject startRoot;
[SerializeField] GameObject answerRoot;
[SerializeField] GameObject endRoot;
[SerializeField] GameObject hintRoot;
[Header("按钮:开始答题 上一题,提交,下一题")]
[SerializeField] Button startBtn;
[SerializeField] Button previousBtn;
[SerializeField] Button submitBtn;
[SerializeField] Button nextBtn;
[SerializeField] Button backToMainBtn;
[Header("按钮:确认提交 取消提交")]
[SerializeField] Button affirmSubBtn;
[SerializeField] Button cancelSubBtn;
[Header("文本:题目序号 解析内容 得分 倒计时 最后得分")]
[SerializeField] Text questionID;
[SerializeField] Text analysisData;
[SerializeField] Text scoreTxt;
[SerializeField] Text countDownTxt;
[SerializeField] Text endTxt;
[Header("内容scroll的content 单选scroll的content 选项scroll的content")]
[SerializeField] Transform contentScrollContent;
[SerializeField] Transform questionBtnRoot;
[SerializeField] Transform selectContent;
[SerializeField] Transform scrollView;
[SerializeField] ToggleGroup questionGroup;
// 答题界面数据内容
private QuestionPanelData mQuestionPanelData;
// 每一道题的题目内容
private QuestionData mQuestionData;
// 题目内容物体
private GameObject mQuestion;
// 选项的链表
private List<Options> options = new List<Options>();
//倒计时的总时间
public float secound ;
[SerializeField] GameObject prefab;
static Panel_Question instance;
public static Panel_Question GetInstance()
{
return instance;
}
private void Awake()
{
Init();
instance = this;
}
/// <summary>
/// 按钮监听
/// </summary>
private void Init()
{
startBtn.onClick.AddListener(StartAnswer);
previousBtn.onClick.AddListener(previousClick);
submitBtn.onClick.AddListener(submitClick);
nextBtn.onClick.AddListener(nextClick);
backToMainBtn.onClick.AddListener(BackToMain);
affirmSubBtn.onClick.AddListener(AffirmSub);
cancelSubBtn.onClick.AddListener(CancelSub);
}
private void Start()
{
//读取xml文件
StartCoroutine(LoadingQu