前言
新手一直不知道该怎么做一个多选题开发模块!对于文件流又不够熟悉,就只能在场景中做题目更换和分数统计。
提示:以下是本篇文章正文内容,下面案例可供参考
一、场景物体
解释一下:
- Dati_Multiply——整个答题模块的父物体,同时也是脚本的载体。
- Img_DatiBackground——答题板的背景图片
- Timu1——空物体,用来将题目和选项整合起来的,方便题目之间的切换
- txt_Topic——题目内容
- ToggleGroup——用于方便获取所有选项的空物体
- A、B、C、D、E——(Toggle类型)该题的所有选项。
- Timu2——同上
- btn_Next——下一题按钮
注意:题目选项数量可随意改变!
二、脚本
代码如下(示例):
using System.Collections;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using UnityEngine;
using UnityEngine.UI;
public class DatiMultiContrpller : MonoBehaviour
{
//题目列表
public List<Transform> timus = new List<Transform>();
//答案列表
public List<string> ans = new List<string>();
//当前显示的题目序号
public int currentTimuIndex = 0;
//答题背景图片
public Transform datiBg;
//题目总数
public int timuNum;
//下一题按钮
public Button btn_nextTi;
//分数
public int score = 0;
private void Awake()
{
Init();
}
/// <summary>
/// 初始化操作
/// </summary>
private void Init()
{
datiBg = transform.Find("Img_DatiBackground");
timuNum = datiBg.childCount;
//题目列表初始化
for (int i = 0; i < timuNum; i++)
{
//通过依次获取子物体,进行列表添加
timus.Add(datiBg.GetChild(i));
}
//答案列表初始化
{
ans.Add("ABCDE");
ans.Add("ABC");
}
//下一题按钮初始化
btn_nextTi = transform.Find("btn_Next").GetComponent<Button>();
btn_nextTi.onClick.AddListener(OnNextTimuClick);
}
/// <summary>
/// 下一题,控制题目显示
/// </summary>
public void OnNextTimuClick()
{
//获取当前题目的所有选项
GetTimuAllSelections();
//对当前题目进行正误判断
IsRight();
//输出一下分数
Debug.Log(score);
//题号++
currentTimuIndex++;
//禁用当前题,启用下一题
if (currentTimuIndex >= timuNum)
{
//结束答题需要进行的操作
Debug.Log("答题结束");
btn_nextTi.enabled = false;
return;
}
timus[currentTimuIndex - 1].gameObject.SetActive(false);
timus[currentTimuIndex].gameObject.SetActive(true);
}
/// <summary>
/// 获取当前题目的所有选项
/// </summary>
/// <param name="currentTimu"></param>
public List<Toggle> GetTimuAllSelections()
{
//ToggleGroup,题目所有选项的父物体
Transform toggleGroup;
toggleGroup = timus[currentTimuIndex].Find("ToggleGroup");
List<Toggle> selections = new List<Toggle>();
for (int i = 0; i < toggleGroup.childCount; i++)
{
selections.Add(toggleGroup.GetChild(i).GetComponent<Toggle>());
}
return selections;
}
/// <summary>
/// 正误判断,统计分数
/// </summary>
public void IsRight()
{
int isRight = 0;
string currentAns = ans[currentTimuIndex];
foreach (var item in GetTimuAllSelections())
{
if (item.isOn)//此项被用户选中,再判断答案中是否有此项
{
//判定答案中是否有这个选项,没有就直接return score,有就正确答案数量+1
if (!currentAns.Contains(item.name))
{
return;
}
else
{
isRight++;
}
}
}
if (isRight > 0 && isRight < currentAns.Length)
{
score += 3;//假设答对但不全得三分
}
else if (isRight == currentAns.Length)
{
score += 5;//全对得5分
}
}
}
总结
其实这个还有很大的优化空间,后续在慢慢改进吧。争取把单选、多选全都整合到一起。
- 题目及答案的添加缺乏灵活性。每次添加题目和答案都要在场景中添加物体,修改脚本中的答案字典。
- 如果可以制作一个题目预制体,将题目内容,选项内容,答案全都序列化,进行动态加载,我想应该会省很多空间和时间。
转载注明出处:https://blog.csdn.net/weixin_44870508/article/details/110438895