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

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

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

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

Q&A

解決済

2回答

1347閲覧

Unityでエラーが出たのですが調べても初心者にはよく分かりかりませんでした。

zappi

総合スコア1

Unity

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

0グッド

0クリップ

投稿2022/03/31 12:38

編集2022/04/02 21:10

エラーコードはこれです。IndexOutOfRangeException: Index was outside the bounds of the array.
セリフ用2.Update () (at Assets/セリフ用2.cs:34)
構文は
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class セリフ用2 : MonoBehaviour
{
public string[] texts;//Unity上で入力するstringの配列
int textNumber;//何番目のtexts[]を表示させるか
string displayText;//表示させるstring
int textCharNumber;//何文字目をdisplayTextに追加するか
int displayTextSpeed; //全体のフレームレートを落とす変数
bool click;
bool textStop; //テキスト表示を始めるか

void Start() { } private void Update() { transform.position = Vector3.one; // コルーチンの起動 if (textStop == false) //テキストを表示させるif文 { displayTextSpeed++; if (displayTextSpeed % 5 == 0)//5回に一回プログラムを実行するif文 { if (textCharNumber != texts[textNumber].Length)//もしtext[textNumber]の文字列の文字が最後の文字じゃなければ { displayText = displayText + texts[textNumber][textCharNumber];//displayTextに文字を追加していく textCharNumber = textCharNumber + 1;//次の文字にする } else//もしtext[textNumber]の文字列の文字が最後の文字だったら { if (textNumber != texts.Length - 1)//もしtexts[]が最後のセリフじゃないときは { StartCoroutine(DelayCoroutine(5, () => { // n秒後にここの処理が実行される displayText = "";//表示させる文字列を消す textCharNumber = 0;//文字の番号を最初にする textNumber = textNumber + 1;//次のセリフにする transform.position = Vector3.zero; })); } else //もしtexts[]が最後のセリフになったら { StartCoroutine(DelayCoroutine(5, () => { // n秒後にここの処理が実行される displayText = ""; //表示させる文字列も消す textCharNumber = 0; //文字の番号を最初にする textStop = true; //セリフ表示を止める transform.position = Vector3.zero; })); } } this.GetComponent<Text>().text = displayText;//画面上にdisplayTextを表示 click = false;//クリックされた判定を解除 } if (Input.GetMouseButton(0))//マウスをクリックしたら { click = true; //クリックされた判定にする } } } // Update is called once per frame // Update is called once per frame private IEnumerator DelayCoroutine(float seconds, Action action) { yield return new WaitForSeconds(seconds); action?.Invoke(); }

}
です。
いろいろ間違っていてもご了承ください

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

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

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

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

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

guest

回答2

0

ベストアンサー

提示して頂いたコードをこちらで実行してみました。原因はコルーチンが何重にも実行され続けることです。

コルーチン内部の実行を5秒遅らせている部分ですが、5秒待っている間にもUpdate()メソッドは毎フレーム実行され続けるわけですからStartCoroutine()が100回以上呼ばれることになります。途中でDebug.Log(textNumber);を出力すれば分かりますが、5秒後に自分の環境ではtextNumber→113になってました。当然配列インデックスがオーバーします。

応急処置としては、コルーチンが実行されるのを待っているか判別するブール変数を用意して、待っている間はテキスト表示処理を行わないという方法があります。

C#

1using System; 2using System.Collections; 3using System.Collections.Generic; 4using UnityEngine; 5using UnityEngine.UI; 6 7public class セリフ用2 : MonoBehaviour 8{ 9 public string[] texts;//Unity上で入力するstringの配列 10 int textNumber;//何番目のtexts[]を表示させるか 11 string displayText;//表示させるstring 12 int textCharNumber;//何文字目をdisplayTextに追加するか 13 int displayTextSpeed; //全体のフレームレートを落とす変数 14 bool click; 15 bool textStop; //テキスト表示を始めるか 16 bool waitCoroutine; //コルーチンを待っているか 17 void Start() 18 { 19 20 } 21 private void Update() 22 { 23 transform.position = Vector3.one; 24 25 // コルーチンの起動 26 27 28 if (textStop == false && waitCoroutine == false) //テキストを表示させるif文 29 { 30 displayTextSpeed++; 31 if (displayTextSpeed % 5 == 0)//5回に一回プログラムを実行するif文 32 { 33 if (textCharNumber != texts[textNumber].Length)//もしtext[textNumber]の文字列の文字が最後の文字じゃなければ 34 { 35 displayText = displayText + texts[textNumber][textCharNumber];//displayTextに文字を追加していく 36 textCharNumber = textCharNumber + 1;//次の文字にする 37 } 38 else//もしtext[textNumber]の文字列の文字が最後の文字だったら 39 { 40 if (textNumber != texts.Length - 1)//もしtexts[]が最後のセリフじゃないときは 41 { 42 waitCoroutine = true; 43 StartCoroutine(DelayCoroutine(5, () => 44 { 45 // n秒後にここの処理が実行される 46 47 48 displayText = "";//表示させる文字列を消す 49 textCharNumber = 0;//文字の番号を最初にする 50 textNumber = textNumber + 1;//次のセリフにする 51 transform.position = Vector3.zero; 52 53 })); 54 } 55 else //もしtexts[]が最後のセリフになったら 56 { 57 waitCoroutine = true; 58 StartCoroutine(DelayCoroutine(5, () => 59 { 60 // n秒後にここの処理が実行される 61 62 63 displayText = ""; //表示させる文字列も消す 64 textCharNumber = 0; //文字の番号を最初にする 65 textStop = true; //セリフ表示を止める 66 transform.position = Vector3.zero; 67 })); 68 } 69 } 70 71 this.GetComponent<Text>().text = displayText;//画面上にdisplayTextを表示 72 click = false;//クリックされた判定を解除 73 } 74 if (Input.GetMouseButton(0))//マウスをクリックしたら 75 { 76 click = true; //クリックされた判定にする 77 } 78 } 79 } 80 81 // Update is called once per frame 82 83 // Update is called once per frame 84 85 private IEnumerator DelayCoroutine(float seconds, Action action) 86 { 87 yield return new WaitForSeconds(seconds); 88 action?.Invoke(); 89 waitCoroutine = false; 90 } 91}

投稿2022/03/31 13:49

編集2022/03/31 15:24
KomoriGameDev

総合スコア433

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

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

zappi

2022/04/02 12:10

ありがとうございます、おかげで成功することが出来ました!
guest

0

C#

1 if (textCharNumber != texts[textNumber].Length)//もしtext[textNumber]の文字列の文字が最後の文字じゃなければ

とありますが、最後の文字数はtexts[textNumber].Length - 1です。

投稿2022/03/31 13:18

fiveHundred

総合スコア9774

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問