LoginSignup
TOM044
@TOM044

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Unityでの4択クイズゲームの問題の順番について

解決したいこと

Unityで4択のクイズゲームを作成しています。
その際に、問題をcsvファイルから読みだしているのですが、
一度目にUnityを起動して解くときは問題ないのですが、
Unityを止めずに二度目を解くときに、csvファイルの一番最後の問題が二度出題され、
csvファイルの一番最初の問題が出題されなくなってしまいます。
解決方法を教えていただきたいです。

発生している問題

csvファイルを一行ずつ、読みだすことには成功したのですが問題の順番がおかしくなってしまいます。
また一部の問題が表示されません

該当するソースコード

C#言語です。
 TextAsset csvFile;
    [SerializeField] private static List<string[]> csvDatas = new List<string[]>();
    [SerializeField] private static List<int> qnumber = new List<int>();
    [SerializeField] private static List<int> qused = new List<int>();
    [SerializeField] private int csvrow=0,k=0;
    [SerializeField] private static int qransu=0,qcount=0,ans=0;
    [SerializeField] private static string answer;
void Start()    
{
    //csvファイルを一行ずつ読み出し、csvDatasというListに格納していく
    csvFile = Resources.Load("F1Quiz") as TextAsset;
    StringReader reader = new StringReader(csvFile.text);
    while(reader.Peek() != -1)
    {
        string line = reader.ReadLine();
        csvDatas.Add(line.Split(','));
        csvrow++;
    }
qransu=0;
---
クイズの問題を出す関数
---
}

//正誤判定の関数
public void Next()
{
    qransu++;
    //すべての問題を解いていたらif文に従って終わる。
    if(qransu == csvrow)
    { 
        GameScene.transform.position = new Vector2(-40,0);
        TMP_Text Ans= GameObject.Find("Canvas/PanelParent/PanelFinish/Ans").GetComponentInChildren<TMP_Text>();
        Ans.text= ans+"問正解!!";
        ans=0;
        qcount=0;
    }
    else
    {
        ---
        クイズの問題を出す関数
        ---
        GameScene.transform.position = new Vector2(0,0);
    }

自分で試したこと

最初は、出題の順番を変えようと思ってListなどを使ってシャッフルしようとしましたが、
できなかったためこのコードにしましたが、それでもうまくいきません。

0

1Answer

お世話になります。
個人的には以下の部分が気になりましたが、各変数がどのように使われているのかを追えなかったため憶測になります。

qransu++;
//すべての問題を解いていたらif文に従って終わる。
if(qransu == csvrow)
{
    GameScene.transform.position = new Vector2(-40,0);
    TMP_Text Ans= GameObject.Find("Canvas/PanelParent/PanelFinish/Ans").GetComponentInChildren<TMP_Text>();
    Ans.text= ans+"問正解!!";
    ans=0;
    // 0を代入してリセットしなくてはならないのはqransu?
    qcount=0;
}

以下の役割と変数名を整理してみるとより分かりやすいかもしれません

// 乱数? ランダム表示していたころの名残? 現在の設問番号を示していたもの?
// questionRandomIndex, questionCurrentIndex など
private static int qransu=0;

// 設問進行数? 
// questionCount など
private static int qcount=0;

// 正解数
// collectAnswerCount など
private static int ans = 0;

また全然別件ですが、Findは実際の開発ではあまり使わない(処理が重い)ので下記のようにするとよいと思います

// 変更前
TMP_Text Ans= GameObject.Find("Canvas/PanelParent/PanelFinish/Ans").GetComponentInChildren<TMP_Text>();
Ans.text= ans+"問正解!!";

// 変更後
[SerializeField] private TMP_Text ansText; // Componentからアタッチ
ansText.text= ans+"問正解!!";

何卒よろしくお願い申し上げます:bow:

0

Comments

  1. @TOM044

    Questioner

    ありがとうございます!!

    if(qransu == csvrow)
            { 
                GameScene.transform.position = new Vector2(-40,0);
                TMP_Text Ans= GameObject.Find("Canvas/PanelParent/PanelFinish/Ans").GetComponentInChildren<TMP_Text>();
                Ans.text= ans+"問正解!!";
                ans=0;
                qransu=0;
            }
    

    このような形にさせていただきました。
    しかし、なぜかこれでもダメでしたので、qransuの初期値を1にしたところうまく表示されるようになりました!!
    また、変数名も今後コードを書く上で参考にさせていただきます!!
    また、処理の重さについても考えてコードを書いていくことを気をつけようと思います。
    本当にありがとうございました!!

Your answer might help someone💌