Unity多选题功能开发


前言

新手一直不知道该怎么做一个多选题开发模块!对于文件流又不够熟悉,就只能在场景中做题目更换和分数统计。


提示:以下是本篇文章正文内容,下面案例可供参考

一、场景物体

在这里插入图片描述解释一下:

  • 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分
        }
    }
}



总结

其实这个还有很大的优化空间,后续在慢慢改进吧。争取把单选、多选全都整合到一起。

  1. 题目及答案的添加缺乏灵活性。每次添加题目和答案都要在场景中添加物体,修改脚本中的答案字典。
  2. 如果可以制作一个题目预制体,将题目内容,选项内容,答案全都序列化,进行动态加载,我想应该会省很多空间和时间。

转载注明出处:https://blog.csdn.net/weixin_44870508/article/details/110438895

猜你喜欢

转载自blog.csdn.net/weixin_44870508/article/details/110438895