Unityでクイズアプリを作成しています。
内容としては
1)三択問題
2)間違えると×が出てゲームオーバー画面が出る
3)正解すると○が出て次の三択問題が出る
4)5問連続で正解するとクリア画面が出る
5)データはCSVファイルから読み込む。CSVに格納しているデータは15問
6)CSVファイルの保存方法はUnicode(UTF-8)
7)クリアした場合もゲームオーバーした場合もその後また「再度挑戦」ボタンで再度挑戦できる。
実際にテストすると最初の内は問題ないのですが5問クリアしてさらに5問クリアして次の
3問目くらいでエラーになって止まってしまいます。
(エラーするのは何問目と特定できずまちまちです)
怪しいのは15問しかないことですが15問目にエラーするわけでもありません。
分かる方教えて下さい。
環境)
Unity2017
言語:C#
エラー出力
ArgumentOutOfRangeException: Argument is out of range. Parameter name: index System.Collections.Generic.List`1[System.String[]].get_Item (Int32 index) (at/Users/builduser/buildslave/unity/build/Runtime/Export/Coroutines.cs:17)
QuizScript
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using System.IO; public class QuizScript : MonoBehaviour { public List<string[]> csvDatas = new List<string[]>(); public Text qcount; public Text setumei; public Text answer1; public Text answer2; public Text answer3; public GameObject atariImage; public GameObject hazureImage; int quizCount; public AudioClip atariClip; public AudioClip hazureClip; private AudioSource seSource; public AudioClip clearClip; public AudioClip overClip; public GameObject ImageOverBase; public GameObject ImageClearBase; public Text stageOverText; public Text stageText; List<int> numbers = new List<int>(); int conunt = 5; List<int> quizNum = new List<int>(); // Use this for initialization void Start () { quizCount = 0; CsvRead("csv/quizcsv"); //CSVを読み込む RandomActive5(); //Quizを5つ番号で決める QuestionLabelSet(); //質問を表示する AnswerLabelSet(); //答えを表示する seSource = gameObject.GetComponent<AudioSource>(); } // Update is called once per frame void Update () { } //最初に表示する5つのクイズNOを決める private void RandomActive5(){ for(int i = 1; i <= 15; i++){ numbers.Add(i); } while (conunt-- > 0){ int index = Random.Range(0, numbers.Count); Debug.Log("index:" + index); int ransu = numbers[index]; quizNum.Add(ransu); numbers.RemoveAt(index); } } private void QuestionLabelSet(){ Text qcountLabel = qcount.GetComponent<Text>(); qcountLabel.text = (quizCount + 1).ToString(); Text setumeiLabel = setumei.GetComponent<Text>(); setumeiLabel.text = csvDatas[quizNum[quizCount]][0]; } private void AnswerLabelSet(){ answer1.GetComponent<Text>().text = csvDatas[quizNum[quizCount]][1]; answer2.GetComponent<Text>().text = csvDatas[quizNum[quizCount]][2]; answer3.GetComponent<Text>().text = csvDatas[quizNum[quizCount]][3]; } public void CsvRead(string csvName){ TextAsset csv = Resources.Load(csvName) as TextAsset; StringReader reader = new StringReader(csv.text); while(reader.Peek() > -1){ string line = reader.ReadLine(); csvDatas.Add(line.Split(',')); } } public void PushQuizChallenge1(){ if((csvDatas[quizNum[quizCount]][4]) == "1"){ atariImage.SetActive(true); AtariActive(); seSource.PlayOneShot(atariClip); CorrectAnswer(); Debug.Log("quizCount" + quizCount); }else{ hazureImage.SetActive(true); seSource.PlayOneShot(hazureClip); StartCoroutine("GameOverCoroutin"); } } public void PushQuizChallenge2(){ if((csvDatas[quizNum[quizCount]][4]) == "2"){ atariImage.SetActive(true); AtariActive(); seSource.PlayOneShot(atariClip); CorrectAnswer(); Debug.Log("quizCount" + quizCount); }else{ hazureImage.SetActive(true); seSource.PlayOneShot(hazureClip); StartCoroutine("GameOverCoroutin"); } } public void PushQuizChallenge3(){ if((csvDatas[quizNum[quizCount]][4]) == "3"){ atariImage.SetActive(true); AtariActive(); seSource.PlayOneShot(atariClip); CorrectAnswer(); Debug.Log("quizCount" + quizCount); }else{ hazureImage.SetActive(true); seSource.PlayOneShot(hazureClip); StartCoroutine("GameOverCoroutin"); } } //コールチンで時間をずらしてゲームオーバー private IEnumerator GameOverCoroutin(){ yield return new WaitForSeconds(2.0f); quizCount = 0; seSource.PlayOneShot(overClip); ImageOverBase.SetActive(true); stageOverText.text = "stage" + (SubButtonController.stageNo).ToString(); } private void CorrectAnswer(){ if(quizCount < 4){ StartCoroutine("CorrectCoroutin"); }else{ quizCount = 0; StartCoroutine("ClearCoroutin"); } } private IEnumerator CorrectCoroutin(){ yield return new WaitForSeconds(1.0f); quizCount++; QuestionLabelSet(); //質問を表示する AnswerLabelSet(); //答えを表示する } private IEnumerator ClearCoroutin(){ yield return new WaitForSeconds(1.0f); seSource.PlayOneShot(clearClip); ImageClearBase.SetActive(true); stageText.text = "stage" + (SubButtonController.stageNo).ToString(); SubButtonController.stageNo++; } private void AtariActive(){ Invoke("AtariNonActive", 1.0f); } void AtariNonActive(){ atariImage.SetActive(false); } }
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。