文章目录
- 答题系统Demo前言
- 准备工作
- 搭建答题系统界面UI
- 将题库xml文件存放在自己创建的XML文件夹下
- 编写脚本实现答题系统相关功能
- Panel_Question.cs脚本挂载到主界面Panel_Question上
- Options.cs脚本挂载的选项预制体上,管理每一个选项的数据
- 答题系统demo演示
- 额外的知识
答题系统Demo前言
大四毕设的时候,参考网上大佬的答题系统,移植到了我的毕设项目中去,总感觉那个答题系统不够满意,但是那会技术有限,没有去深入研究完善,而且总有bug,后面答辩后也没管了。工作了,学的东西多了点,琢磨着自己也搞个答题系统玩玩,这个demo用的是加载XML文档的方法创建题目,xml文档中可以设置题目是单选还是多选。有上一题、下一题的功能,每一题都有提交功能,只有选择了答案才能提交,提交了会显示题目的解析。能满足一般的答题系统的需求了。
准备工作
搭建答题系统界面UI
如图所示:
其中题目选项和解析内容使用滚动视图(scroll view)来规范显示内容。这里还需要在滚动视图的content物体上添加自动布局的组件:设置垂直布局自适应。
注意:
在使用滚动视图的地方,将content作为父物体的,都要在content物体上添加自动布局组件,并在子元素自适应,不然你会看到生成的题目有可能飞到十万八千里之外,那这样在视图里面就看不到了。
将题库xml文件存放在自己创建的XML文件夹下
xml文档内容格式如下:
编写脚本实现答题系统相关功能
Panel_Question.cs脚本挂载到主界面Panel_Question上
public class Panel_Question : MonoBehaviour
{
///
/// 上一题按钮
///
private Button previousBtn;
///
/// 提交按钮
///
private Button submitBtn;
///
/// 下一题按钮
///
private Button nextBtn;
///
/// 当前是第几道题
///
private Text questionID;
///
/// 解析内容文本
///
private Text analysisData;
///
/// 题目的父节点
///
private Transform questionRoot;
private Transform questionBtnRoot;
///
/// 选项的组
///
private ToggleGroup questionGroup;
///
/// 答题界面数据内容
///
private QuestionPanelData mQuestionPanelData;
///
/// 每一道题的题目内容
///
private QuestionData mQuestionData;
///
/// 题目内容物体
///
private GameObject mQuestion;
///
/// 题目计数
///
private int mQuestionCount;
///
/// 选项的链表
///
private List options=new List();
private void Awake()
{
Init();
}
///
/// 初始化找到相关物体和组件,并给按钮添加监听方法
///
private void Init()
{
previousBtn = transform.Find("BGImage/topic/btn_Previous").GetComponent
DataPath.cs全局静态类:
Options.cs脚本挂载的选项预制体上,管理每一个选项的数据
public class Options : MonoBehaviour
{
///
/// 当前选项组件
///
public Toggle thisToggle;
///
/// 选项的内容文本
///
public Text optionText;
///
/// 选项对应的分数
///
public int score;
///
/// 选项的状态
///
public bool IsSelect=false;
public void Init(AnswerData answerData)
{
optionText.text = answerData.option;
score = answerData.Score;
thisToggle.onValueChanged.AddListener((isSelect) => { IsSelect = isSelect; });
}
}
答题系统demo演示
单选:
多选:
选错:
这个答题系统满足了基本的单选多选需求,后期可以考虑完善其他功能…
额外的知识
demo用到的Application.dataPath指的是程序的数据文件所在的文件夹路径,这里是因为在PC平台使用www类加载资源,所以加载路径要使用file://协议实现加载,否则会加载失败。平台不一样,路径也不一样。
执行以下代码:
① Yield return null,在此表示暂缓一帧,在下一帧才执行后面的代码,等同于yield return +任意数字,yield return www表示等待资源加载完成,再执行后面的代码,等同于www.isDone.
② using语句在此处的作用是,使用了www类的实例,结束的时候自动调用Dispose处理实例对象。即将其释放掉。
③ Unity里加载xml文件的一般流程是:引入System.Xml命名空间,写加载解析的函数,函数里先创建xml文档的对象:XmlDocument doc=new XmlDocument();,再通过调用XmlNodeList、XmlNode、XmlElement等类的属性和方法去遍历查找并读取相关的节点数据。
④ Xml类常用的一些类和方法:
其中Load()方法是指可以从 一个指定的文件中解析内容,而LoadXml()则是加载有xml格式字符串到DOM对象中。