🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

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

Q&A

解決済

2回答

1640閲覧

ListでIndexOutOfRangeException

YDK

総合スコア63

C#

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

0グッド

0クリップ

投稿2020/12/06 08:42

今、Unityで会話シーンの実装をしているのですが

C#

1/// <summary> 会話中に表示するキャラクター </summary> 2 [SerializeField] private Image character; 3 /// <summary> キャラクターを切り替えるSprite </summary> 4 private Sprite[] sprite; 5 /// <summary> MessageWindowのText </summary> 6 [SerializeField] Text converText; 7 /// <summary> CSVから読み込んだTextを格納 </summary> 8 private List<string> scenariosData = new List<string>(); 9 /// <summary> CSVから読み込んだTextの値を格納 </summary> 10 private List<int> charNum = new List<int>(); 11 /// <summary> 文字ごとに表示する速度 </summary> 12 private float converSpeed = 0.1f; 13 /// <summary> 表示中の会話文 </summary> 14 private int converListIndex = 0; 15 /// <summary> 表示中の文字 </summary> 16 private int converCount = 0; 17 /// <summary> 文字スキップのフラグ </summary> 18 private bool isSkip = false; 19 20 private void Start() 21 { 22 sprite = Resources.LoadAll<Sprite>("Character"); 23 character = this.GetComponent<Image>(); 24 LoadCSV(); 25 StartCoroutine(ConversationSending()); 26 } 27 28 private void Update() 29 { 30 //if (Input.GetMouseButtonDown(0) && isSkip) 31 //{ 32 // converCount = scenariosData[converListIndex].Length; 33 //} 34 CharacterChange(); 35 } 36 37 private IEnumerator ConversationSending() 38 { 39 while (converListIndex < scenariosData.Count) 40 { 41 converText.text = string.Empty; 42 converCount = 0; 43 44 while (converCount < scenariosData[converListIndex].Length) 45 { 46 isSkip = true; 47 converText.text += scenariosData[converListIndex].Replace("\n", "\n")[converCount]; 48 yield return new WaitForSeconds(converSpeed); 49 converCount++; 50 } 51 52 isSkip = false; 53 converListIndex++; 54 yield return new WaitUntil(() => Input.GetMouseButtonDown(0)); 55 //StartCoroutine(ConversationSending()); 56 } 57 } 58 59 private void LoadCSV() 60 { 61 TextAsset csv = Resources.Load<TextAsset>("CSV/Scenarios"); 62 StringReader reader = new StringReader(csv.text); 63 64 int i = 0; 65 while (reader.Peek() > -1) 66 { 67 string scenarios = reader.ReadLine(); 68 string[] values = scenarios.Split(','); 69 70 for (int j = 0; j < values.Length - 1; j++) 71 { 72 scenariosData.Add(values[0]); 73 charNum.Add(int.Parse(values[1])); 74 //Debug.Log(scenariosData[i] + "," + charNum[i]); 75 //Debug.Log(values[i]); 76 } 77 i++; 78 } 79 }

一つ目の要素の会話文が終わると
converText.text += scenariosData[converListIndex].Replace("\n", "\n")[converCount];
の所でIndexOutOfRangeException:index was outside the bounds of the arrayのエラーが出ます。

Addで要素を足していってるので大丈夫だと思うんですけど、なぜなのでしょうか?。
回答お願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

while の継続条件は、Replace前の文字列の長さであるのに、その後に文字長が短くなるようなreplaceをしていて、replace後の文字列にインデクスアクセスしているからではないでしょうか?

csharp

1while (converCount < scenariosData[converListIndex].Length)

投稿2020/12/06 20:50

papinianus

総合スコア12705

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

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

YDK

2020/12/07 01:47

while文の中にReplaceを入れたら直りました。 言われてみるまで全然気がつかなかったです。 回答ありがとうございました。何かあったらまたお願いします。
guest

0

要するに、配列の範囲を超えてアクセスしたという例外です。
VisualStudioを使ってるなら、そこの行でブレークポイントを設定して実行を止めて、それぞれの配列のサイズとインデックスを見ましょう。

投稿2020/12/06 09:04

y_waiwai

総合スコア88040

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

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

YDK

2020/12/06 10:21

debugをしてみた所、csvの文字列の中に\nが入ってる行だけエラーを吐いています あああ\nいいい\nううう みたいに改行したいところに書いて、Scriptで改行しています。 \nが入ってることが原因なのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問