質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

2回答

352閲覧

Unity)何度も挑戦するとエラーになる

navesanta

総合スコア198

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2018/07/17 09:34

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); } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

不具合の原因が分からなかったので不具合の要因と思われるRandomActive5のスクリプトをRandom.RangeからGuid.NewGuidに変更したら不具合は起きなくなりました。

numbers = numbers.OrderBy(i => Guid.NewGuid()).ToArray();

投稿2018/07/19 00:36

navesanta

総合スコア198

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

~~RandomActive5でランダムで問題を抽出してると思いますが、
0から15の合計16個の範囲を取っていますが、
問題は15問しか存在しないためOut of Rangeエラーが発生しているのでは無いでしょうか
~~

追記:int型のRandom.Rangeはmaxの値を含まないことを知りませんでしたので一旦取り消します

投稿2018/07/17 10:21

編集2018/07/17 10:23
MMashiro

総合スコア2378

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問