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

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

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

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

Q&A

解決済

2回答

1703閲覧

Array index is out of range.が直せない。

zaq13

総合スコア14

C#

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

0グッド

0クリップ

投稿2018/03/29 05:21

現在、他のスクリプトから文字列を受け取ってそれをテキストボックスに流れるテキストにして表示するスクリプトを作成しています。受け取る文字列の量が多く、管理のためにstring型の配列にして受け取るようにしていたのですが、上記の通り、Array index is out of range.というエラーが発生しました。                                                          
調べると配列の要素を指定する[]内に入れていた変数が配列の範囲を超える可能性があるとのことで、配列の要素数を変数が超えることがないようにスクリプトを整えたのですが、それでもエラーが発生してしまいます。まず間違いなくこちらの技術不足が原因なのですが、自分ではエラーの原因を見つけることができませんでした。なぜエラーが発生するのか、そしてどうすれば直るのか、教えていただけると助かります。

c#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5public class Newtextscript : MonoBehaviour { 6 7 Text mytext; 8 9 //表示させるテキストそのもの 10 public string[] m_text; 11 12 //テキストの流れる速度を管理するためのタイマー 13 float m_timer; 14 15 //テキストの流れる速度を設定する変数 16 float m_nextletter; 17 18 //テキストの描画される文字数 19 int m_currentIndex; 20 21 //配列の要素数とカウンターを兼ねる変数。 22 public int i; 23 24 // Use this for initialization 25 void Start () { 26   //テキストを取得。 27 mytext = GetComponentInChildren<Text>(); 28 29      //各値の初期化。 30 m_timer = 0.0f; 31 m_currentIndex = 0; 32 m_nextletter = 0.1f; 33      //エラー対策。 後々別のものを代入するが、仮の配列の実体を作成。(要素数を確定していないのが原因と思ったため。) 34      m_text = new string[5]; 35 36 //エラー対策。仮の配列の実体に値を入れてみた。 37 for (i = 0; i <= 5; i++) 38 { 39 m_text[i] = ""; 40 } 41   //改めてiの値を初期化。 42       i = 0; 43 } 44 45 // Update is called once per frame 46 void Update () { 47    //流れる速度を調整するためのタイマー 48 m_timer += Time.deltaTime; 49 if (m_timer > m_nextletter) 50 { 51      //タイマーの初期化 52 m_timer = 0.0f; 53 54 //描画する文字数の増加 55 m_currentIndex++; 56        57 //描画させる文字数が元の文字列の文字数を超えないか確認。 58      if (m_currentIndex > m_text[i].Length) 59 { 60 //超えているならすべて文字列を消去し、配列内の次の文字列に移る。 61       m_currentIndex = 0; 62 i++; 63 64 } 65            //エラー対策。配列の要素数をiが超えることの無いように指定。 66 if (i >= m_text.Length) 67 { 68 i = 0; 69 } 70 } 71 //実際にテキストに文字列を描画。(表示する文字数を増やしながら繰り返すことで流れるテキストを作成。) 72     string text = m_text[i].Substring(0, m_currentIndex); 73 mytext.text = text; 74 75 } 76 77} 78 79```このスクリプトはtextの親であるcanvasにアタッチしているものです。

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

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

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

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

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

guest

回答2

0

ベストアンサー

      m_text = new string[5];

このとき、取られるのは m_text[0]~m_text[4] の5つです

for (i = 0; i <= 5; i++)

これではダメですね


      if (m_currentIndex > m_text[i].Length)

これもダメ

if (i >= m_text.Length)

この処理はもっと前に入れないとダメですね

投稿2018/03/29 05:31

編集2018/03/29 06:07
y_waiwai

総合スコア87719

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

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

zaq13

2018/03/29 07:46

回答ありがとうございます。 確かにi<=5はi<=4ですね。 下のif(m_currentIndex > m_text[i].Length)はm_text.Lengthで配列の要素数、m_text[i].Lengthで文字列m_text[i]の文字数という分け方をしていたのですが、文法的にアウトなやつですかね? 事前にdebug.logでのテストはしていたのですが、、、。 if(i >= m_text.Length)はi++の処理が終わってから入れるべきだと思っていたので、結構ショックです。 自分でも調べようと思いますが、よろしければ理由も交えて教えていただけると助かります。 勉強不足で申し訳ありません。
y_waiwai

2018/03/29 07:51

> 下のif(m_currentIndex > m_text[i].Length)はm_text.Lengthで配列の要素数、m_text[i].Lengthで 文法的にはOKです 他の方の回答にもありますが、ここの比較は >= でないといけません Update関数が呼ばれる時、i の値が10とか20とかだったらどうなるのか考えてみましょう。 #そうならないように注意してプログラムを組むんだ! #というならいいですけどw
zaq13

2018/03/29 07:58

何度もありがとうございます。確かにi = 0はif{~内に入れたらダメな奴ですね。 update内のif文から外させていただきました。 助かります!
zaq13

2018/03/29 08:04

i = 0の文をif{m_timer~}内から外してstring text~との間に入れるとエラーがなくなりました!本当に回答してくださった方々ありがとうございました!
y_waiwai

2018/03/29 08:08 編集

いや、それはかまわない。 i の範囲のチェックを、 >      if (m_currentIndex > m_text[i].Length) の前に入れよう、ということです。 i がグローバル変数で定義してるため、Update関数が呼ばれるときに、iの値がどうなってるかはわかりません。なので、範囲チェックを、その配列を使用する前に行っておくということになります
zaq13

2018/03/29 08:20

最後まで間違っていた( ;∀;) すいません。結局最後まで説明してもらって、、、、。 そういうことだったんですね。自身の勉強不足を痛感しました。精進させていただきます。 ありがとうございました!
guest

0

iではなくm_currentIndexが原因ではないでしょうか?
(m_text[i]のn文字目は「0」〜「m_text[i].Length - 1」)

if (m_currentIndex > m_text[i].Length)
上記の行は
if (m_currentIndex >= m_text[i].Length)
こうではないでしょうか。

投稿2018/03/29 05:30

sakura_hana

総合スコア11425

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

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

zaq13

2018/03/29 08:00

回答ありがとうございます!スクリプト内にエラーの原因が大量にあるみたいで、申し訳ないです。 要素数が0から始まるということを考慮していないのが根本的な原因みたいですね。修正させていただきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問