推荐阅读

  • CSDN主页
  • GitHub开源地址
  • Unity3D插件分享
  • 简书地址
  • 我的个人博客
  • QQ群:1040082875

一、前言

这是本专栏系列的第一篇,答题系统的开发。

这个答题系统,可以从文本文档中提取题目和分数,然后绑定到UI上,在答题的过程中,自动判断分数,自动判断正确率。

目的是实现一个可快速导入到项目中使用的小模块。

二、效果图及工程下载


题目文档:
https://wwr.lanzoui.com/ihV6nphkzsf
密码:47z2

源工程:
https://wwr.lanzoui.com/i7wpaphkzuh

三、实现

3-1 界面搭建

首先,新建工程,然后摆UI,如下图所示:

3-2 读取文档

题目存放在txt文档中,首先,我们看一下结构:

每一行都是一道题目,然后题号、题目、选项、得分,都是用冒号进行分割的。

下一步就需要用脚本进行读取文档了。

新建脚本Answer.cs:编写代码:

读取文档:

using System.Collections.Generic;
using UnityEngine;public class Answer : MonoBehaviour
{//读取文档string[][] ArrayX;string[] lineArray;private int topicMax = 0;//最大题数private List<bool> isAnserList = new List<bool>();//存放是否答过题的状态void Start(){TextCsv();}/*****************读取txt数据******************/void TextCsv(){//读取csv二进制文件  TextAsset binAsset = Resources.Load("YW", typeof(TextAsset)) as TextAsset;//读取每一行的内容  lineArray = binAsset.text.Split('\r');//创建二维数组  ArrayX = new string[lineArray.Length][];//把csv中的数据储存在二维数组中  for (int i = 0; i < lineArray.Length; i++){ArrayX[i] = lineArray[i].Split(':');}//查看保存的题目数据for (int i = 0; i < ArrayX.Length; i++){for (int j = 0; j < ArrayX[i].Length; j++){Debug.Log(ArrayX[i][j]);}}//设置题目状态topicMax = lineArray.Length;for (int x = 0; x < topicMax + 1; x++){isAnserList.Add(false);}}
}

可以看到,所有的题目数据都读取出来了:

3-3 加载题目

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;public class Answer : MonoBehaviour
{//读取文档string[][] ArrayX;//题目数据string[] lineArray;//读取到题目数据private int topicMax = 0;//最大题数private List<bool> isAnserList = new List<bool>();//存放是否答过题的状态//加载题目public GameObject tipsbtn;//提示按钮public Text tipsText;//提示信息public List<Toggle> toggleList;//答题Togglepublic Text indexText;//当前第几题public Text TM_Text;//当前题目public List<Text> DA_TextList;//选项private int topicIndex = 0;//第几题void Start(){TextCsv();LoadAnswer();}/*****************读取txt数据******************/void TextCsv(){//读取csv二进制文件  TextAsset binAsset = Resources.Load("YW", typeof(TextAsset)) as TextAsset;//读取每一行的内容  lineArray = binAsset.text.Split('\r');//创建二维数组  ArrayX = new string[lineArray.Length][];//把csv中的数据储存在二维数组中  for (int i = 0; i < lineArray.Length; i++){ArrayX[i] = lineArray[i].Split(':');}//设置题目状态topicMax = lineArray.Length;for (int x = 0; x < topicMax + 1; x++){isAnserList.Add(false);}}/*****************加载题目******************/void LoadAnswer(){tipsbtn.SetActive(false);tipsText.text = "";for (int x = 0; x < 4; x++){toggleList[x].isOn = false;}indexText.text = "第" + (topicIndex + 1) + "题:";//第几题TM_Text.text = ArrayX[topicIndex][1];//题目int idx = ArrayX[topicIndex].Length - 3;//有几个选项for (int x = 0; x < idx; x++){DA_TextList[x].text = ArrayX[topicIndex][x + 2];//选项}}
}


题目正常加载:

3-4 按钮功能

 /*****************按钮功能******************/void Select_Answer(int index){switch (index){case 0://提示int idx = ArrayX[topicIndex].Length - 1;int n = int.Parse(ArrayX[topicIndex][idx]);string nM = "";switch (n){case 1:nM = "A";break;case 2:nM = "B";break;case 3:nM = "C";break;case 4:nM = "D";break;}tipsText.text = "<color=#FFAB08FF>" +"正确答案是:"+ nM + "</color>";break;case 1://上一题if (topicIndex > 0){topicIndex--;LoadAnswer();}else{tipsText.text = "<color=#27FF02FF>" + "前面已经没有题目了!" + "</color>";}break;case 2://下一题if (topicIndex < topicMax-1){topicIndex++;LoadAnswer();}else{tipsText.text = "<color=#27FF02FF>" + "哎呀!已经是最后一题了。" + "</color>";}break;case 3://跳转int x = int.Parse(jumpInput.text) - 1;if (x >= 0 && x < topicMax){topicIndex = x;jumpInput.text = "";LoadAnswer();}else{tipsText.text = "<color=#27FF02FF>" + "不在范围内!" + "</color>";}break;}}

3-5 题目对错判断

/*****************题目对错判断******************/void AnswerRightRrongJudgment(bool check,int index){if (check){//判断题目对错bool isRight;int idx = ArrayX[topicIndex].Length - 1;int n = int.Parse(ArrayX[topicIndex][idx]) - 1;if (n == index){tipsText.text = "<color=#27FF02FF>" + "恭喜你,答对了!" + "</color>";isRight = true;tipsbtn.SetActive(true);}else{tipsText.text = "<color=#FF0020FF>" + "对不起,答错了!" + "</color>";isRight = false;tipsbtn.SetActive(true);}//正确率计算if (isAnserList[topicIndex]){tipsText.text = "<color=#FF0020FF>" + "这道题已答过!" + "</color>";}else{anserint++;if (isRight){isRightNum++;}isAnserList[topicIndex] = true;TextAccuracy.text = "正确率:" + ((float)isRightNum / anserint * 100).ToString("f2") + "%";}//禁用掉选项for (int i = 0; i < toggleList.Count; i++){toggleList[i].interactable = false;}}}

将按钮对象拖进卡槽中,运行程序即可:

完整代码如下:

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;public class Answer : MonoBehaviour
{//读取文档string[][] ArrayX;//题目数据string[] lineArray;//读取到题目数据private int topicMax = 0;//最大题数private List<bool> isAnserList = new List<bool>();//存放是否答过题的状态//加载题目public GameObject tipsbtn;//提示按钮public Text tipsText;//提示信息public List<Toggle> toggleList;//答题Togglepublic Text indexText;//当前第几题public Text TM_Text;//当前题目public List<Text> DA_TextList;//选项private int topicIndex = 0;//第几题//按钮功能及提示信息public Button BtnBack;//上一题public Button BtnNext;//下一题public Button BtnTip;//消息提醒public Button BtnJump;//跳转题目public InputField jumpInput;//跳转题目public Text TextAccuracy;//正确率private int anserint = 0;//已经答过几题private int isRightNum = 0;//正确题数void Awake(){TextCsv();LoadAnswer();}void Start(){toggleList[0].onValueChanged.AddListener((isOn) => AnswerRightRrongJudgment(isOn,0));toggleList[1].onValueChanged.AddListener((isOn) => AnswerRightRrongJudgment(isOn,1));toggleList[2].onValueChanged.AddListener((isOn) => AnswerRightRrongJudgment(isOn,2));toggleList[3].onValueChanged.AddListener((isOn) => AnswerRightRrongJudgment(isOn,3));BtnTip.onClick.AddListener(() => Select_Answer(0));BtnBack.onClick.AddListener(() => Select_Answer(1));BtnNext.onClick.AddListener(() => Select_Answer(2));BtnJump.onClick.AddListener(() => Select_Answer(3));}/*****************读取txt数据******************/void TextCsv(){//读取csv二进制文件  TextAsset binAsset = Resources.Load("YW", typeof(TextAsset)) as TextAsset;//读取每一行的内容  lineArray = binAsset.text.Split('\r');//创建二维数组  ArrayX = new string[lineArray.Length][];//把csv中的数据储存在二维数组中  for (int i = 0; i < lineArray.Length; i++){ArrayX[i] = lineArray[i].Split(':');}//设置题目状态topicMax = lineArray.Length;for (int x = 0; x < topicMax + 1; x++){isAnserList.Add(false);}}/*****************加载题目******************/void LoadAnswer(){for (int i = 0; i < toggleList.Count; i++){toggleList[i].isOn = false;}for (int i = 0; i < toggleList.Count; i++){toggleList[i].interactable = true;}tipsbtn.SetActive(false);tipsText.text = "";indexText.text = "第" + (topicIndex + 1) + "题:";//第几题TM_Text.text = ArrayX[topicIndex][1];//题目int idx = ArrayX[topicIndex].Length - 3;//有几个选项for (int x = 0; x < idx; x++){DA_TextList[x].text = ArrayX[topicIndex][x + 2];//选项}}/*****************按钮功能******************/void Select_Answer(int index){switch (index){case 0://提示int idx = ArrayX[topicIndex].Length - 1;int n = int.Parse(ArrayX[topicIndex][idx]);string nM = "";switch (n){case 1:nM = "A";break;case 2:nM = "B";break;case 3:nM = "C";break;case 4:nM = "D";break;}tipsText.text = "<color=#FFAB08FF>" +"正确答案是:"+ nM + "</color>";break;case 1://上一题if (topicIndex > 0){topicIndex--;LoadAnswer();}else{tipsText.text = "<color=#27FF02FF>" + "前面已经没有题目了!" + "</color>";}break;case 2://下一题if (topicIndex < topicMax-1){topicIndex++;LoadAnswer();}else{tipsText.text = "<color=#27FF02FF>" + "哎呀!已经是最后一题了。" + "</color>";}break;case 3://跳转int x = int.Parse(jumpInput.text) - 1;if (x >= 0 && x < topicMax){topicIndex = x;jumpInput.text = "";LoadAnswer();}else{tipsText.text = "<color=#27FF02FF>" + "不在范围内!" + "</color>";}break;}}/*****************题目对错判断******************/void AnswerRightRrongJudgment(bool check,int index){if (check){//判断题目对错bool isRight;int idx = ArrayX[topicIndex].Length - 1;int n = int.Parse(ArrayX[topicIndex][idx]) - 1;if (n == index){tipsText.text = "<color=#27FF02FF>" + "恭喜你,答对了!" + "</color>";isRight = true;tipsbtn.SetActive(true);}else{tipsText.text = "<color=#FF0020FF>" + "对不起,答错了!" + "</color>";isRight = false;tipsbtn.SetActive(true);}//正确率计算if (isAnserList[topicIndex]){tipsText.text = "<color=#FF0020FF>" + "这道题已答过!" + "</color>";}else{anserint++;if (isRight){isRightNum++;}isAnserList[topicIndex] = true;TextAccuracy.text = "正确率:" + ((float)isRightNum / anserint * 100).ToString("f2") + "%";}//禁用掉选项for (int i = 0; i < toggleList.Count; i++){toggleList[i].interactable = false;}}}
}

四、后言

整体来看,只使用了一个场景,一个脚本,就完成了答题系统。

步骤如下:
1、读取文档
2、解析文档保存数据
3、根据数据加载题目
4、上一题下一题,选项选择,跳转,按钮的功能实现

代码还是延期了一贯的简洁风格,希望你可以在这篇文章学到东西。

【Unity3D应用案例系列】答题系统开发相关推荐

  1. 【Unity3D应用案例系列】专栏文章导读清单

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 一.前言 凡事总是有有点兴趣才会去做的对嘛,我已经有一个专栏去分享小游戏的开 ...

  2. 【Unity3D应用案例系列】计算器工具开发

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 一.前言 Hello,又见面了,今天分享如何使用Unity制作计算器,难度中 ...

  3. 【Unity3D应用案例系列】Unity3D中实现抽奖功能

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 一.前言 本博文标题和内容参考: 被黑心商家坑了N次,探究抽奖背后的秘密 - ...

  4. 雨林木风系统md5值_微软停止Windows系列新系统开发,珍惜你的Win10吧。。。

    最近微软闹了个大新闻,他们亲手撕掉了养了几十年的儿子 Windows. 这么说有些夸张了,微软是不可能放弃 Windows 的. 准确的说...是 撤销了 Windows 部门. 很长一段时间, Wi ...

  5. Unity3D 开发工具系列 日志系统:输出模块ConsoleAppender

    Unity3D 开发工具系列 日志系统:核心模块Logging Unity3D 开发工具系列 日志系统:调用封装Log Unity3D 开发工具系列 日志系统:输出模块ConsoleAppender ...

  6. Unity3D 开发工具系列 日志系统:配置模块LogConfig

    Unity3D 开发工具系列 日志系统:核心模块Logging Unity3D 开发工具系列 日志系统:调用封装Log Unity3D 开发工具系列 日志系统:输出模块ConsoleAppender ...

  7. 微信小程序购物商城系统开发系列-工具篇

    微信小程序购物商城系统开发系列-工具篇 微信小程序开放公测以来,一夜之间在各种技术社区中就火起来啦.对于它 估计大家都不陌生了,对于它未来的价值就不再赘述,简单一句话:可以把小程序简单理解为一个新的操 ...

  8. java建站系统开发教程系列之设计表结构

    java建站系统开发教程系列之设计表结构 根据需求设计表结构如下: SET FOREIGN_KEY_CHECKS=0; -- Table structure for tbl_articles -- - ...

  9. ZYNQ开发系列——ZYNQ系统的搭建

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 ZYNQ开发系列--ZYNQ系统的搭建 DDR设置 FLASH设置 UART设置 网口设置 当我们有一个要用ZYNQ做的项目时,首先当 ...

最新文章

  1. linux查看流量开源,Linux流量监控工具 - iftop
  2. Arcgis10.2安装与解决 [转载自麻辣GIS]
  3. 比较强得一个个性签名
  4. 【NOIP2013模拟】粉刷匠 题解代码
  5. 获取Ip所在城市名与详细
  6. 5种设置ASP.NET Core应用程序URL的方法
  7. ajax调用后台java类_ajax调用java后台方法是什么
  8. H264视频压缩编码标准简介(二)
  9. 为什么采用4~20mA的电流来传输模拟量?(转)
  10. 汉字字符编码的科普笔记(GB2312汉字编码,Unicode与UTF-8,字符映射表,vim,文泉驿,正则表达式)
  11. 《私募股权基金投资基础知识》---第四章
  12. php ldap 登陆验证,LDAP用户验证功能简介
  13. 广西大学考计算机可以拿创新学分吗,广西大学创新实践学分实施办法
  14. 关于cpu散热片(及风扇)的固定问题
  15. python傅里叶谐波分析_傅里叶变换及其谐波提取
  16. android获取内部存储卡里的文件,获取Android内部存储(外部SD卡)和扩展存储卡(TF卡)的路径...
  17. 疯狂鼹鼠 java,神话延续! 光滑镜面时尚MOTO轻薄W220详尽评测
  18. long类型在32位系统和64位系统的问题(android O )
  19. 设计模式(四) Observe——观察者模式
  20. oracle中删除级联方法,解析Oracle中多表级联删除的方法

热门文章

  1. 云服务器到底是什么?云服务器的优势有哪些
  2. 推荐 6 个火爆 GitHub 的开源项目
  3. 近段时间参加的CTF竞赛部分题目复现(ISCC2020 、GKCTF、网鼎杯)
  4. 仿爱乐透android客户端界面实现(附工程源码)
  5. 纳尼?Collections对时间戳排序出错了??
  6. 软件测试才是系统级别错误,软件测试部BUG级别定义
  7. Windows进不去系统(蓝屏、黑屏、BIOS更新等无法开机的情况),试试这几种解决办法
  8. sqlserver 2008 Express离线安装包
  9. html5混合app原理,HTML5混合App开发
  10. python内推群_重要!!!陌陌2020校招Python内推通道(含内推直链)