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

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

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

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

Q&A

解決済

1回答

193閲覧

ArgumentOutOfRangeExceptionエラー(Unity)

kcp9

総合スコア3

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

0グッド

0クリップ

投稿2024/10/27 02:34

c#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class MessageWindow : MonoBehaviour 7{ 8 public int CutI; 9 public string MassegeU; 10 public Text Massege; 11 public int MsDl1; 12 // Start is called before the first frame update 13 void Start() 14 { 15 StartCoroutine("MassTyping"); 16 } 17 18 // Update is called once per frame 19 void Update() 20 { 21 22 } 23 24 IEnumerator MassTyping() 25 { 26 CutI = 0; 27 Massege.text = ""; 28 MassegeU = "あいうえお"; 29 MsDl1 = MassegeU.Length; 30 for (int i = 0; i < MsDl1; i++) 31 { 32 CutI = i + 1; 33 Massege.text = Massege.text + MassegeU.Substring(CutI -1 , CutI); 34 yield return new WaitForSeconds(0.5f); 35 } 36 } 37}

というコードを書いていて、MassTypingというコルーチンを実行するとMassage.text が[あいうえお] となるように作っているつもりなのですが、[あいううえお] となってしまいますし、

error

1ArgumentOutOfRangeException: Index and length must refer to a location within the string. 2Parameter name: length 3System.String.Substring (System.Int32 startIndex, System.Int32 length) (at <695d1cc93cca45069c528c15c9fdd749>:0) 4MessageWindow+<MassTyping>d__6.MoveNext () (at Assets/Game/Script/Text/MessageWindow.cs:35) 5UnityEngine.SetupCoroutine.InvokeMoveNext (System.Collections.IEnumerator enumerator, System.IntPtr returnValueAddress) (at <c62cc0ef748e4107b21e2999fa50d73a>:0)

というエラーが出てきてゲームが停止してしまいます。
このエラーの要因と解決方法、できればMassage.textが[あいううえお]とならずに[あいうえお]となるようにする方法を教えてください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Substringはこちらのリファレンスにある通り
何文字目から何文字目までを切り取るのではなく何文字目から指定の長さを切り取るものとなります。

ですからループを順番に実行していくと以下のようになります。

iCutIMassegeU.Substringの引数MassegeU.Substringの結果Massege.text
01Substring(0,1)
12Substring(1,2)いうあいう
23Substring(2,3)うえおあいううえお
34Substring(3,4)文字列の長さを超えるのでArgumentOutOfRangeExceptionあいううえお

という動きになります。

一文字づつ追加していきたいのであれば

C#

1 for (int i = 0; i < MsDl1; i++) 2 { 3 Massege.text = Massege.text + MassegeU.Substring(i , 1); 4 yield return new WaitForSeconds(0.5f); 5 }

と1文字づつ切り出して追加していくとか

C#

1 for (int i = 1; i <= MsDl1; i++) 2 { 3 Massege.text = MassegeU.Substring(0 , i); 4 yield return new WaitForSeconds(0.5f); 5 }

と切り出す長さを変えていくといったことになるかと思います。

投稿2024/10/27 03:45

編集2024/10/27 03:51
YAmaGNZ

総合スコア10469

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

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

kcp9

2024/10/27 07:18

回答ありがとうございます。 substringに対する誤解が解けました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問