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

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

ただいまの
回答率

87.49%

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 5,005

score 14

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

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Newtextscript : MonoBehaviour {

    Text mytext;

    //表示させるテキストそのもの
    public string[] m_text;

    //テキストの流れる速度を管理するためのタイマー
    float m_timer;

    //テキストの流れる速度を設定する変数
    float m_nextletter;

    //テキストの描画される文字数
    int m_currentIndex;

    //配列の要素数とカウンターを兼ねる変数。
    public int i;

    // Use this for initialization
    void Start () {
    //テキストを取得。
      mytext = GetComponentInChildren<Text>();

      //各値の初期化。
                m_timer = 0.0f;
        m_currentIndex = 0;
        m_nextletter = 0.1f;
      //エラー対策。    後々別のものを代入するが、仮の配列の実体を作成。(要素数を確定していないのが原因と思ったため。)
         m_text = new string[5];

           //エラー対策。仮の配列の実体に値を入れてみた。 
             for (i = 0; i <= 5; i++)
        {
            m_text[i] = "";
        }
      //改めてiの値を初期化。
       i = 0;
    }

    // Update is called once per frame
    void Update () {
    //流れる速度を調整するためのタイマー
        m_timer += Time.deltaTime;
        if (m_timer > m_nextletter)
        {
      //タイマーの初期化
            m_timer = 0.0f;

            //描画する文字数の増加
            m_currentIndex++;
       
            //描画させる文字数が元の文字列の文字数を超えないか確認。
      if (m_currentIndex > m_text[i].Length)
            {
                //超えているならすべて文字列を消去し、配列内の次の文字列に移る。    
       m_currentIndex = 0;
                i++;

            }
            //エラー対策。配列の要素数をiが超えることの無いように指定。
            if (i >= m_text.Length)
            {
                i = 0;
            }
        }
        //実際にテキストに文字列を描画。(表示する文字数を増やしながら繰り返すことで流れるテキストを作成。)
     string text = m_text[i].Substring(0, m_currentIndex);
        mytext.text = text;

    }

}

このスクリプトはtextの親であるcanvasにアタッチしているものです。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

         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 17:04

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

    キャンセル

  • 2018/03/29 17:07 編集

    いや、それはかまわない。
    i の範囲のチェックを、
    >      if (m_currentIndex > m_text[i].Length)
    の前に入れよう、ということです。

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

    キャンセル

  • 2018/03/29 17:20

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

    キャンセル

+1

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 17:00

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

    キャンセル

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

  • ただいまの回答率 87.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る