Verwendung von JSON zur Implementierung von Beurteilungsfragen in Unity

Json-Multiple-Choice-Fragen: https://blog.csdn.net/falsedewuxin/article/details/129651872?spm=1001.2014.3001.5502

Json-Multiple-Choice-Fragen: https://blog.csdn.net/falsedewuxin/article/details/129653639?spm=1001.2014.3001.5502

1. Erstellen Sie ein einfaches UI-Antwortfeld und ein Bewertungsfeld

2. Erstellen Sie einen neuen DataTest-Ordner und erstellen Sie in diesem Ordner eine neue Json-Datei „MyData“.

Hinweis: Das Codierungsformat der JSON-Datei sollte UTF-8 sein, andernfalls werden verstümmelte chinesische Zeichen angezeigt (Sie können die JSON-Datei erstellen, sie mit Notepad öffnen und dann die Codierung ändern, wenn Sie sie speichern unter), falls dies der Fall ist wurde gespeichert als und ändert die Kodierung in UTF-8. Gehen Sie zurück zu Unity und klicken Sie auf die Datei, um sie anzuzeigen. Stellen Sie fest, dass die Zeichen immer noch verstümmelt sind. Sie können versuchen, eine neue Word-Datei zu erstellen und die Word-Datei in eine JSON-Datei zu ändern , und verwenden Sie dann Notepad, um es im UTF-8-Codierungsformat zu speichern

3. Fügen Sie die Fragendaten in JSON ein (die Frage und die Antwort sind gekritzelt).

{
  "selects": [
    {
      "title": "1.c#的数据类型有",
      "selectAnswer": [ "T", "F"],
      "answer": "F"
    },
    {
      "title": "2.下列描述错误的是",
      "selectAnswer": [ "T", "F"],
      "answer": "T"
    },
    {
      "title": "3.下列关于构造函数的描述正确的是",
      "selectAnswer": [ "T", "F"],
      "answer": "T"
    },
    {
      "title": "4.装箱、拆箱操作发生在",
      "selectAnswer": [ "T", "F" ],
      "answer": "F"
    },
    {
      "title": "5.下列选项中可以被渲染的纹理是",
      "selectAnswer": [ "T", "F" ],
      "answer": "T"
    }
  ]
}

Überprüfen Sie, ob das JSON-Format korrekt ist: https://www.bejson.com/

4. Fügen Sie dem Canvas eine Toggle Group-Komponente hinzu, aktivieren Sie die Eigenschaft „Ausschalten zulassen“, wählen Sie die vier Toggles aus und ziehen Sie den Canvas auf die Group-Eigenschaft der Toggle-Komponente der vier Toggles

5. Hängen Sie das Skript auf der Leinwand ein und ziehen Sie das entsprechende Objekt in die Skripteigenschaften

using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.UI;

public class JsonTest : MonoBehaviour
{
    Selections data;
    //题目
    public Text titleText;
    //选项
    public Toggle[] toggles = new Toggle[2];
    //记录自己选择的所有答案
    List<string> answers = new List<string>();
    //记录答题时的临时答案
    string ans = null;
    //拿题库里面的答案
    List<string> allAnswers = new List<string>();
    int currentIndex = 0;
    public Button last;
    public Button next;
    //得分
    int score = 0;
    //得分面板
    public GameObject scorePanel;
    // Start is called before the first frame update
    void Start()
    {
        //Application.dataPath这个只对PC有效
        string path = Application.dataPath + "/DataTest/MyData.json";
        string str = File.ReadAllText(path);
        data = JsonUtility.FromJson<Selections>(str);
        //记录题库中的所有答案
        for (int i = 0; i < data.selects.Count; i++)
        {
            allAnswers.Add(data.selects[i].answer);
        }
        for (int i = 0; i < allAnswers.Count; i++)
        {
            answers.Add(null);
        }
        ShowSelect(currentIndex);
    }
    //加载题目
    public void ShowSelect(int index)
    {    
        //显示题目
        titleText.text = data.selects[index].title;
        //显示题目
        for (int i = 0; i < toggles.Length; i++)
        {
            toggles[i].transform.GetChild(1).GetComponent<Text>().text = data.selects[index].selectAnswer[i];
        }
    }
    //检测选项是否点击
    public void Tt(bool isSelect)
    {
        if (isSelect)
            ans = "T";
        else
            ans=null;
    }
    public void Ft(bool isSelect)
    {
        if (isSelect)
            ans = "F";
        else
            ans = null;
    }
    //下一题
    public void NextSelect()
    {   
        answers.RemoveAt(currentIndex);
        answers.Insert(currentIndex, ans);
        currentIndex++;
        ans = null;
        if (currentIndex < allAnswers.Count)
        {
            ShowSelect(currentIndex);
            ShowAnswer(currentIndex);
        }
        else
        {
            for (int i = 0; i < allAnswers.Count; i++)
            {
                if (allAnswers[i].Equals(answers[i]))
                {
                    score += 20;
                }
            }
            scorePanel.SetActive(true);
            scorePanel.transform.GetChild(0).GetComponent<Text>().text = "得分:" + score;
        }
    }
    //上一题
    public void LastSelect()
    {
        currentIndex--;
        ans = null;
        ShowSelect(currentIndex);
        ShowAnswer(currentIndex);
    }
    //显示当前题目是否已经作答
    public void ShowAnswer(int index)
    {
        for (int i = 0; i < toggles.Length; i++)
        {
            toggles[i].isOn = false;
        }
        switch (answers[index])
        {
            case "T":
                toggles[0].isOn = true;
                break;
            case "F":
                toggles[1].isOn = true;
                break;
            default:
                break;
        }
    }
    //再次答题按钮
    public void AgainSelect()
    {
        answers.Clear();
        for (int i = 0; i < allAnswers.Count; i++)
        {
            answers.Add(null);
        }
        score = 0;
        currentIndex = 0;
        ShowSelect(currentIndex);
        ShowAnswer(currentIndex);
        scorePanel.SetActive(false);
    }
    // Update is called once per frame
    void Update()
    {
        //隐藏和显示上一题的按钮
        if (currentIndex > 0)
        {
            last.gameObject.SetActive(true);
        }
        else
        {
            last.gameObject.SetActive(false);
        }
        if (currentIndex < allAnswers.Count-1)
        {
            next.transform.GetChild(0).GetComponent<Text>().text = "下一题";
        }
        else
        {
            next.transform.GetChild(0).GetComponent<Text>().text = "结束答题";
        }
    }
}
[System.Serializable]
public class SelectSingle
{
    //名称要和SelectData.json中selects中的属性名中的一一对应
    public string title;
    public List<string> selectAnswer = new List<string>();
    public string answer;
}
[System.Serializable]
public class Selections
{
    //这里的selects必须和SelectData.json中的selects中一样才行
    public List<SelectSingle> selects = new List<SelectSingle>();
}

6. Fügen Sie im Skript die entsprechenden Methoden für verschiedene Schalter und Schaltflächen hinzu

Umschalten

Taste

7. Führen Sie einfach Unity aus

Hinweis: Wenn es einen Fehler gibt, korrigieren Sie mich bitte

Fazit: Der Baum, der umarmt, entsteht am Ende der Haare; die neunstöckige Plattform beginnt auf dem Erdhaufen; die Reise von tausend Meilen beginnt mit einem einzigen Schritt.

Supongo que te gusta

Origin blog.csdn.net/falsedewuxin/article/details/129657252
Recomendado
Clasificación