Unity答题系统案例

前言

Unity答题系统,可适配单选或多选

偶然看到一种使用二进制表示选项的方法,让我茅塞顿开,没想到还能有这样的思路,所以拿出来分享一下

运行示例

 方法思路

我这里答题系统做了一个简单的案例,思路主要是以下几点

  1. 通过读取StreamingAssets文件内的xml文件来获取题库,题库内存储的数据我会在下面介绍,后期打包后也可以修改题库
  2. 然后就是自定义类,存储获取到的题库
  3. 最后通过读取题库中的存储的十进制数,将十进制数转化为二进制,然后对照ASCII码表来匹配正确答案

 获取题库方法

void GetData()
    {
        if (File.Exists(path))
        {
            XmlDocument xmldoc = new XmlDocument();
            xmldoc.Load(path);
            XmlNodeList nodeList = xmldoc.SelectSingleNode("Root").ChildNodes;
            topic_Count = nodeList.Count;
            foreach (XmlElement xel in nodeList)  //36
            {
                int order = int.Parse(xel.GetAttribute("id"));
                Data data = new Data();
                foreach (XmlElement xe2 in xel.ChildNodes)  
                {
                    int j = 0;
                    foreach (XmlElement xe3 in xe2.ChildNodes)
                    {
                        switch (j)
                        {
                            case 0:
                                {
                                    data.question.key = int.Parse(xe3.GetAttribute("key"));
                                    data.question.title = xe3.InnerText;
                                }
                                break;
                            default:
                                data.question.answer.Add(xe3.InnerText);
                                data.question.isAnswer = new bool[data.question.answer.Count];
                                break;
                        }
                        j++;
                    }
                }
                QuestionBanks.Add(order, data);

            }
        }
    }

xml题库文件配置如下

自定义类

public class Data
{
    public int order;
    public Question question = new Question();
}
public class Question
{
    public string title;
    public List<string> answer = new List<string>();
    public bool[] isAnswer;
    public int key;
}

public enum BtnState
{
    normal,
    check,
    complete

}

答题卡部分

    void ShowAnswerCard()
    {
        if (topic_Count > 0)
        {
            Debug.Log(topic_Count);
            for (int i = 1; i <= topic_Count; i++)
            {
             
                GameObject obj = Instantiate(card);
                obj.name = i.ToString();
                obj.transform.SetParent(cardContent);
                obj.GetComponentInChildren<Text>().text = i.ToString();
                //存入答题卡列表
                card_btn.Add(obj.GetComponent<Button>());
   
            }
        }
    }

转化题库key值为选项

public static string NumToABC(int num)
    {
        string str = Convert.ToString(num, 2);
        string strResult = null;
        for (int i = str.Length - 1, j = 0; i >= 0; i--)
        {
            if (str.Length >= i)
            {
                string c = str.Substring(str.Length - 1, 1);
               //转化Ascii码
                if (c != "0")
                {
                    char a = (char)(i + 65);
                    if (j == 0)
                    {
                        strResult += a;
                    }
                    else
                    {
                        strResult += "," + a;
                    }
                    j++;
                }
            }
        }
        if (strResult == null)
        {
            return "(未选择)";
        }
        else
        {
            return strResult;//返回转化后的选项
        }
    }

更新题库内容

  private void InitateTopic(int order)
    {
        //进入之后先判断是否有选项-有选项匹配选项内容,无选项默认
        // up down 切换  直接选择切换
        if (order == 0 || order > QuestionBanks.Count)
        {
            Debug.Log("序列号有误" + order + "  " + QuestionBanks.Count);
            return;
        }
       
        if (GetComponent<ToggleGroup>())
        {
            Destroy(GetComponent<ToggleGroup>());
        }

        data = QuestionBanks[order];

        int letterCount = Regex.Matches(NumToABC(data.question.key), "[a-zA-Z]").Count;
        bool tog_IsOn = false;
        for (int i = 0; i < answer_Tog.Length; i++)
        {
            answer_Tog[i].group = null;
            answer_Tog[i].isOn = data.question.isAnswer[i];
            answer_Tog[i].interactable = false;
            answer_Tog[i].GetComponentInChildren<Text>().text = data.question.answer[i];
            if (answer_Tog[i].isOn)
            {
                Debug.Log("有选项");
                tog_IsOn = true;
            }
        }
        if (tog_IsOn)
        {
            Debug.Log("有选项");
            ensure_Btn.interactable = false;

            if (selectedButton.image.color != selectedButton.colors.pressedColor)
            {
                selectedButton.image.color = selectedButton.colors.normalColor;
            }
            card_btn[currentOrder - 1].image.color = card_btn[currentOrder - 1].colors.pressedColor;
            selectedButton = card_btn[currentOrder - 1];

            if (GetComponent<ToggleGroup>())
            {
                Destroy(GetComponent<ToggleGroup>());
            }
            
            if (letterCount <= 1)
            {
                for (int i = 0; i < answer_Tog.Length; i++)
                {
                    answer_Tog[i].isOn = data.question.isAnswer[i];
                }
                title_Txt.text = "<color=#FFFFFF00>XX</color>" +order+"."+ data.question.title+"(单选题)";
            }
            else
            {
                Debug.Log("多选");
                for (int i = 0; i < answer_Tog.Length; i++)
                {
                    answer_Tog[i].isOn = data.question.isAnswer[i];
                }
                title_Txt.text = "<color=#FFFFFF00>XX</color>" + order + "." + data.question.title+"(多选题)";
            }
        } 
        else
        {
           // Debug.Log("无选项"+selectedButton.name+" "+currentOrder);
            ensure_Btn.interactable = true;

         
            if (selectedButton.image.color!= selectedButton.colors.pressedColor)
            {
                selectedButton.image.color =selectedButton.colors.normalColor;
            }
            card_btn[currentOrder - 1].image.color = card_btn[currentOrder - 1].colors.highlightedColor;
            selectedButton = card_btn[currentOrder - 1];

            if (letterCount <= 1)
            {
                if (GetComponent<ToggleGroup>() == null)
                {
                    gameObject.AddComponent<ToggleGroup>();
                }
                for (int i = 0; i < answer_Tog.Length; i++)
                {
                    answer_Tog[i].group=GetComponent<ToggleGroup>();
                    answer_Tog[i].isOn = false;
                    answer_Tog[i].interactable = true;

                }
                GetComponent<ToggleGroup>().allowSwitchOff = true;
                title_Txt.text = "<color=#FFFFFF00>XX</color>" + order + "." + data.question.title+ "(单选题)";
            }
            else
            {
                if (GetComponent<ToggleGroup>())
                {
                    Destroy(GetComponent<ToggleGroup>());
                }
                for (int i = 0; i < answer_Tog.Length; i++)
                {
                    answer_Tog[i].interactable = true;
                    answer_Tog[i].isOn = false;
                }
                title_Txt.text = "<color=#FFFFFF00>XX</color>" + order + "." + data.question.title + "(多选题)";
            }


            //存入四个选项状态
            ensure_Btn.onClick.AddListener(() =>
            {
             
                ensure_Btn.interactable = false;

                if (GetComponent<ToggleGroup>())
                {
                    Destroy(GetComponent<ToggleGroup>());
                }
                AnswerClose(data);
                string key = string.Empty;
                key = string.Format("{0:D4}", int.Parse(Convert.ToString(data.question.key, 2)));
                for (int i = 0; i < data.question.answer.Count; i++)
                {

                    if (key.Substring(3 - i, 1) == "1" && !answer_Tog[i].isOn)
                    {
                        Debug.Log("选择错误");
                        return;
                    }
                    else if (key.Substring(3 - i, 1) == "0" && answer_Tog[i].isOn)
                    {
                        Debug.Log("选择错误");
                        return;
                    }
                }
                Debug.Log("选择正确");
            });
        }
    }

存储选项方法

    void AnswerClose(Data data)
    {
        for (int i = 0; i < answer_Tog.Length; i++)
        {
            answer_Tog[i].interactable = false;
            data.question.isAnswer[i] = answer_Tog[i].isOn;
            ensure_Btn.interactable = false;
            if (answer_Tog[i].isOn)
            {
                Debug.Log("有选择");

                card_btn[currentOrder - 1].image.color = card_btn[currentOrder - 1].colors.pressedColor;
                selectedButton = card_btn[currentOrder - 1];
            }
        }
    }
    private void Start()
    {
        order = int.Parse(GetComponentInChildren<Text>().text);
        btn.onClick.AddListener(() =>
        {
            QuestionBank.Instance.currentOrder = order;
            Debug.Log(QuestionBank.Instance.selectedButton.name);
            if (QuestionBank.Instance.selectedButton.GetComponent<CardBtn>().btnState!=BtnState.complete)
            {
                selectBtn = QuestionBank.Instance.selectedButton;

                QuestionBank.Instance.selectedButton.image.color = selectBtn.colors.normalColor;
            }
            QuestionBank.Instance.selectedButton = btn;
            QuestionBank.Instance.RestTopic();
        });
    }

 总结

一个简单的demo,还有很多可以扩展的空间,比如通过excel类型的题库读取,或者是多扩展出填空题之类的

  • 7
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Unity2D 是一款非常流行的游戏引擎,可以用于开发各种类型的游戏,包括答题游戏。许多开发者需要一个答题系统源码来参考和学习,这里就向大家介绍一下 Unity2D 答题系统源码。 Unity2D 答题系统源码主要包括两个部分:界面设计和功能实现。界面设计包括题目展示、选项显示、计时器、得分等,这些都需要通过 Unity2D 引擎实现。功能实现涉及到游戏逻辑、数据管理、UI 交互等方面,需要开发者根据自己的需求进行设计和编写。 在使用 Unity2D 答题系统源码时,需要注意以下几点: 1. 熟悉 Unity2D 引擎,掌握常用的 2D 游戏开发技术。 2. 根据游戏规则和要求进行功能设计和实现,包括题目难度、题型、分数计算等。 3. 使用 C# 编程语言进行代码编写,包括游戏逻辑、UI 交互、数据管理等。 4. 界面设计需要考虑用户体验,如何让用户更方便、更快速地进行答题操作。 5. 确保代码的可扩展性和可维护性,方便后续的修改和维护工作。 总体来说,Unity2D 答题系统源码可以让开发者更快速地实现答题游戏功能,并且可以根据自己的需要进行修改和扩展。但是需要开发者具备一定的编程和设计技能,才能更好地使用 Unity2D 引擎进行游戏开发。 ### 回答2: Unity2D答题系统源码是一个基于Unity2D引擎开发的答题游戏源码。该源码可以帮助初学者了解和掌握Unity2D的开发技巧,同时也可以作为答题游戏的基础代码,方便开发者快速进行二次开发。 该源码包含了题目的制作、难度等级的设置、计分系统、倒计时等核心功能。玩家可以通过点击正确的答案来获得积分,同时还可以利用道具来增加自己的分数和答题时间。 在该源码的开发过程中,我们需要掌握Unity2D引擎的基本知识和编程技巧,比如物体的移动、碰撞检测、动画控制等。同时还需要了解答题游戏的设计原理和玩家习惯,才能开发出适合玩家的游戏。 总之,Unity2D答题系统源码是一个重要的学习资料,它可以帮助我们深入理解Unity2D引擎的开发技巧,同时也可以作为开发答题游戏的基础代码,提高游戏的开发效率和质量。 ### 回答3: Unity2D答题系统源码是一种基于Unity2D游戏引擎答题系统源代码。它主要提供一组可定制的答题功能,包括题目类型、难度等。这个系统可以用于各种类型的测试,比如知识测试、考试、调查、竞赛等。 这个答题系统源码提供了一个完整的框架,可以方便地修改和扩展。它包含了一个用户管理系统答题系统和结果分析系统。每个用户可以注册并登录,然后选择他们想参加的测试。用户可以选择一个或多个题目类型和难度,然后开始答题。测试结束后,用户可以看到自己的得分,并可以查看自己的答案和正确答案。管理员可以在后台管理用户和测试,查看测试结果和分析报告。 这个系统的优点是,它构建在Unity2D游戏引擎的基础之上,可扩展性强,可以适应不同的需求。它还具有用户友好的界面,可以吸引用户并提供良好的参与体验。此外,这个系统源码是免费提供的,任何人都可以使用和修改它,让它更好地满足自己的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

立刀人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值