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

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

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

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

Unity

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Q&A

解決済

2回答

670閲覧

indexのエラーの改善

joseff

総合スコア1

C#

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

Unity

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

0グッド

0クリップ

投稿2020/08/31 11:39

前提・実現したいこと

初学者で、Unity(C#)でタイピングゲームを作っています。
使っているスクリプトはこれのみです。
エラーが出ずに進められるようにしたいです。

発生している問題・エラーメッセージ

2問目で入力を行おうとすると IndexOutOfRangeException: Index was outside the bounds of the array. TypingSoft.Update () (at Assets/TypingSoft.cs:57)が表示されてしまいます。

該当のソースコード

using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class TypingSoft : MonoBehaviour { // 問題の何文字目か private int index; // 問題の日本語文 private string[] qJ = {"問題", "テスト", "タイピング"}; // 問題のローマ字文 private string[] qR = {"monndai", "tesuto", "taipinngu"}; // 日本語表示テキスト private Text UIJ; // ローマ字表示テキスト private Text UIR; // 日本語問題 private string nQJ; // ローマ字問題 private string nQR; // 問題番号 private int num; // 入力した文字列テキスト private Text UII; // 正解数 private int correctN; // 正解数表示用テキストUI private Text UIcorrectA; // 正解した文字列を入れておく private string correctString; void Start() { // テキストUIを取得 UII = transform.Find("InputPanel/Input").GetComponent<Text>(); UIcorrectA = transform.Find("DataPanel/Correct Answer").GetComponent<Text>(); // テキストUIを取得 UIJ = transform.Find("InputPanel/QuestionJ").GetComponent<Text>(); UIR = transform.Find("InputPanel/QuestionR").GetComponent<Text>(); // データ初期化処理 correctN = 0; UIcorrectA.text = correctN.ToString(); // 問題出力メソッドを呼ぶ OutputQ(); } // Update is called once per frame void Update() { // キーを押しているかどうか if(Input.anyKeyDown && (!Input.GetMouseButton(0) && !Input.GetMouseButton(1) && !Input.GetMouseButton(2)) ) { // 今見ている文字とキーボードから打った文字が同じかどうか if(Input.GetKeyDown(nQR[index].ToString())) { // 正解時の処理を呼び出す Correct(); } else { // 失敗時の処理を呼び出す Mistake(); } } } //タイピング正解時の処理 void Correct() { Debug.Log("正解"); // 正解数を増やす correctN++; UIcorrectA.text = correctN.ToString(); // 正解率の計算 CorrectAnswerRate(); // 正解した文字を表示 correctString += nQR[index].ToString(); UII.text = correctString; // 次の文字を指す index++; // 問題を入力し終えたら次の問題を表示 if(index >= nQR.Length) { OutputQ(); } } // タイピング失敗時の処理 void Mistake() { Debug.Log("失敗"); } // 正解率の計算処理 void CorrectAnswerRate() { Debug.Log("正解率計算"); } // 新しい問題を表示するメソッド void OutputQ() { // テキストUIを初期化する UIJ.text = ""; UIR.text = ""; UII.text = ""; // 正解した文字列を初期化 correctString = ""; // 問題数内でランダムに選ぶ num = Random.Range(0, qJ.Length); // 選択した問題をテキストUIにセット nQJ = qJ[num]; nQR = qR[num]; UIJ.text = nQJ; UIR.text = nQR; } }

試したこと

問題ごとに初期化していないindexに問題があるのではないかなと考え、index=0などを挿入したのですがうまくいきませんでした。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

ベストアンサー

エラーが出る行の直前でindexと文字列の長さをログ出力してみてください。どこかで想定と異なる値になっていると思います。

投稿2020/08/31 11:53

shiena

総合スコア1827

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

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

0

google翻訳
IndexOutOfRangeException: インデックスが配列の範囲外だった。

ということなので、そのインデックスが、配列の範囲内になるようにすればいいだけのはなしです。

投稿2020/08/31 11:44

y_waiwai

総合スコア88024

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問