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

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

新規登録して質問してみよう
ただいま回答率
85.35%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

C#

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

Unity

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

Q&A

解決済

2回答

1701閲覧

unity c# CSVの値を取り出せない。

cream-._.-

総合スコア15

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

C#

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

Unity

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

0グッド

0クリップ

投稿2020/03/05 14:54

編集2020/03/05 23:55

csvを使ってクイズづくりに挑戦しているのですがなかなかcsvの値を取り出すことができず困っています。 本当はうまく作動してたのですがセーブを忘れて変なところからロードしてからバグりました。

######ちなみに、csvを読み込む方法などは こちらのこんぶさんのを参考にしています。 unityのバージョンは2019.3.3f1です。

#エラーコード
ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.
(google先生による和訳:ArgumentOutOfRangeException:インデックスが範囲外でした。 負ではなく、コレクションのサイズより小さくなければなりません。)

__ Question Reader .csのmakeQuestion.answer = (questionDatas[1][2]);
という場所で発生しています。__

###MakeQuestion.cs

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class MakeQuestion : MonoBehaviour 7{ 8 public Text numbertext; 9 public Text questiontext; 10 public Text answerbuttonchoices1; 11 public Text answerbuttonchoices2; 12 public Text answerbuttonchoices3; 13 14 public GameObject answerCheck; 15 public GameObject questionReader; 16 17 int max_questionnumber = 2; 18 public int questionnumber = 0; 19 public List<string> choices = new List<string>(); 20 public string answer; 21 22 // Start is called before the first frame update 23 void Start() 24 { 25 nextqusetion(); 26 } 27 28 // Update is called once per frame 29 void Update() 30 { 31 32 } 33 34 void choicesrandom() 35 { 36 int randomnumber; 37 string randomi; 38 choices.Clear(); 39 40 QuestionReader questionReader = GetComponent<QuestionReader>(); 41 questionReader.randomdata(); 42 43 for (int i = 0; i < choices.Count; i++) 44 { 45 randomi = choices[i]; 46 randomnumber = Random.Range(0, choices.Count); 47 choices[i] = choices[randomnumber]; 48 choices[randomnumber] = randomi; 49 } 50 51 randomi = choices[choices.IndexOf(answer)]; 52 randomnumber = Random.Range(0, 3); 53 choices[choices.IndexOf(answer)] = choices[randomnumber]; 54 choices[randomnumber] = randomi; 55 randomnumber++; 56 answerCheck.GetComponent<AnswerCheck>().answer = randomnumber; 57 } 58 59 public void nextqusetion() 60 { 61 if (questionnumber != max_questionnumber) 62 { 63 questionnumber++; 64 choicesrandom(); 65 choices.Add(questionReader.GetComponent<QuestionReader>().questionDatas[questionnumber][1]); 66 choices.Add(questionnumber + "/" + max_questionnumber + "問 " + questionReader.GetComponent<QuestionReader>().questionDatas[questionnumber][0]); 67 questiontext.text = choices[5]; 68 numbertext.text = choices[6]; 69 answerbuttonchoices1.text = choices[0]; 70 answerbuttonchoices2.text = choices[1]; 71 answerbuttonchoices3.text = choices[2]; 72 } 73 74 } 75}

###QuestionReader.cs

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using System.IO; 5 6public class QuestionReader : MonoBehaviour 7{ 8 public List<string[]> questionDatas = new List<string[]>(); //CSVデータ保存リスト 9 10 // Start is called before the first frame update 11 void Start() 12 { 13 //読み込み 14 TextAsset questionCSV = Resources.Load("Question") as TextAsset; 15 StringReader reader = new StringReader(questionCSV.text); 16 17 //リストにCSVデータを入れる 18 while(reader.Peek() != -1) 19 { 20 string data = reader.ReadLine(); //一行ずつ読み込む 21 questionDatas.Add(data.Split(',')); //,ごとに分けてリストに入れる 22 } 23 24 //questionDatas[行][列] 25 26 print(questionDatas[2][2]); //ここだけなぜか反応する なぜだ..... 27 28 } 29 30 // Update is called once per frame 31 void Update() 32 { 33 34 } 35 36 public void randomdata() 37 { 38 MakeQuestion makeQuestion = GetComponent<MakeQuestion>(); 39 makeQuestion.answer = (questionDatas[1][2]); 40 makeQuestion.choices.Add(makeQuestion.answer); 41 makeQuestion.choices.Add(questionDatas[makeQuestion.questionnumber][3]); 42 makeQuestion.choices.Add(questionDatas[makeQuestion.questionnumber][4]); 43 makeQuestion.choices.Add(questionDatas[makeQuestion.questionnumber][5]); 44 makeQuestion.choices.Add(questionDatas[makeQuestion.questionnumber][6]); 45 } 46} 47

#検討したこと

  • CSVの値を取り出す場所を変えてみた。(MakeQuestionもQuestionReaderも試したがQuestionReaderのStartしか反応しない)
  • Googleですごい調べた。

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

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

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

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

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

BluOxy

2020/03/05 17:14 編集

そのエラーはどの行で発生しているのでしょうか。また、ArgumentOutOfRangeException が何かはご存知でしょうか。
cream-._.-

2020/03/05 23:53

Question Reader .csのmakeQuestion.answer = (questionDatas[1][2]); という場所で発生しています。
YAmaGNZ

2020/03/06 00:31

QuestionReaderのStartよりMakeQuestionのStartのほうが先に動いているのではないですか?
Zuishin

2020/03/06 03:00

なんかやたらと複雑なことをしていますが、シンプルに QuestionReader を普通のオブジェクトにして MakeQuestion で作成すればいいだけのように思います。
guest

回答2

0

ベストアンサー

例外が発生したときはその例外が 何の例外なのか、何故発生したのか を最初に調査する必要があります。

ArgumentOutOfRangeException

引数の値が、呼び出されたメソッドで定義されている許容範囲外である場合にスローされる例外

ArgumentOutOfRangeException 例外がスローされる条件には、次のようなものがあります。

インデックス番号によってコレクションのメンバーを取得しようとしていますが、インデックス番号が無効です。 これは、ArgumentOutOfRangeException 例外の最も一般的な原因です。

実際に cream-._.- さんが掲示したコードのエラー行を確認すると、questionDatas という配列に [1][2] というインデックス番号を指定しています。ここが怪しいのではないでしょうか。

なので、実際に questionDatas かどのような状態かを確認してください。
確認をするためには VisualStudio のブレークポイント等、デバッガの機能を利用してください。

投稿2020/03/06 02:50

編集2020/03/06 02:53
BluOxy

総合スコア2663

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

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

cream-._.-

2020/03/06 04:03

わかりやすいご回答ありがとうございます。このエラーはunityのほうに問題があったみたいで、オブジェクトにスクリプトをもう一回アタッチしたら直しました。
guest

0

そこまでわかっているのなら、

Question Reader .csのmakeQuestion.answer = (questionDatas[1][2]); という場所で発生しています。

の、questionDatasがどういうサイズを持ってるのか確認してみればどうでしょう

投稿2020/03/06 01:18

y_waiwai

総合スコア88042

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

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

cream-._.-

2020/03/06 04:03

ためになるご回答ありがとうございます。このエラーはunityのほうに問題があったみたいで、オブジェクトにスクリプトをもう一回アタッチしたら直しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問