unity:クイズゲームのクイズ番号を重複なく並び替える方法

unity:クイズゲームのクイズ番号を並び替える方法



# 概要

クイズゲームで「クイズの番号を並び替えたい」ということはありませんか？今回は「クイズごとにシーンが異なる場合」のクイズ番号を並び替えて再生させる方法をお伝えします！


>やりたい実装：シーンを重複なく順番を並び替えてそのシーンの順番に実行していく
>
>やること
>①並び替え（このスクリプト内で順番を決める　”Debugに表示されるようにしてる”）
>②毎回次に飛ぶシーンが変わるので、「今何問目か」（　int QuestionCount )その数に応じて飛ぶシーンの先を切り替える
・変数保持をしてシーンが変わるたびにQuestionCount++; するようにする
・ifを使って「もし今QuestionCountが５なら、SceneManamger.LoadScene(useList[5]）みたいに、QuestionCountの数によって飛ぶシーンの分岐をさせる



# 順番を決めてリストに格納

1.以下のようなコードを書きます。

```c#:StartSceneScript

public class Scene : MonoBehaviour
{
    // Start is called before the first frame update

    int start = 1;
    int end = 5;

    //↓1~10までの問題数を数えるためのリスト
    List<int> numbers = new List<int>();

    //順番に並び替えたものを格納するためのリスト（ここのリストに入った順番にシーン再生をする）
    public static List<int> useList = new List<int>();

  
    void Start()
    {

        for (int i = start; i <= end; i++)
        {
            numbers.Add(i);
        }

        while (numbers.Count > 0)
        {
            //↓その数の中からランダムで抽出
            int index = Random.Range(0, numbers.Count);
            int ransu = numbers[index];
            Debug.Log(ransu);

            //↓リストに格納（番号を順番に取り出し、棚に格納するイメージ。ここで指定された番号の順番にシーン移動が実行される感じ）
            useList.Add(ransu);
            numbers.RemoveAt(index);
        }
    }

```


# 最初のシーンの続きに次のシーンに移るスクリプトを書く

```c#:StartSceneScript
  //スタートボタンを押したときの実装→シーンの一番目に飛ぶ
    public void RandomSceneChange()
    {
        SceneManager.LoadScene(useList[0]);
    }
```

先ほど格納したリストの番号を当てはめて次のシーンは「リストの０番」にとぶようにしています。
（この場合はシーンを１、２、３のように番号のみにしてあります。シーンが番号の場合でないとこのスクリプトは適応できません）

# シーンのとんだ回数を数えるスクリプト

今回はStartSceneScript とは別で数を数えるスクリプトを使っておりますが、StartSceneScriptの中に書いても問題ありません。

```C#:ScoreBoxScript

public class ScoreBoxScript : MonoBehaviour
{
    public static int QuestionCount =0;
    public static int truecount = 0;
    public static int falsecount = 0;
   
```
上記は、問題数のカウント、正解数のカウント、不正解数のカウントをしています。staticを使用して変数の共有をします。


# シーンごとのスクリプト

シーンはリストに格納された順番にとびます。その際に今何問目かを取得し、その数に応じてとぶ番号を変えるというものになります。１００問など問題数が多い場合にはコードが長くなってしまうので、問題が１０個程度の場合までに使用できるスクリプトです。
(途中から省略しています）
    
```C#:Scene1Script

public class Scene1Script : MonoBehaviour
{   
    // Start is called before the first frame update
    void Start()
    {
        ScoreBoxScript.QuestionCount++;
        Debug.Log(ScoreBoxScript.QuestionCount);
    }

    // Update is called once per frame
    void Update()
    {
    }

     public void Ontrue ()

    {
        ScoreBoxScript.truecount++;

        if (ScoreBoxScript.truecount == 1)
        {
            SceneManager.LoadScene(Scene.useList[1]);
        }

        if (ScoreBoxScript.truecount == 2)
        {
            SceneManager.LoadScene(Scene.useList[2]);
        }

        if (ScoreBoxScript.truecount == 3)
        {
            SceneManager.LoadScene(Scene.useList[3]);
        }

        if (ScoreBoxScript.truecount == 4)
        {
            SceneManager.LoadScene(Scene.useList[4]);
        }

        if (ScoreBoxScript.truecount == 5)
        {
            SceneManager.LoadScene(Scene.useList[5]);
        }       

    }

     public void Onfalse()
    {
        ScoreBoxScript.falsecount++;
    }
}
```

上記の書き方は、正解した場合と間違えた場合で分けていますが、区別が必要ない場合は分けなくて大丈夫です。正解した場合にリストに格納された次のシーンにとぶ場合のスクリプトです。