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

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

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

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

Unity3D

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

Unity

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

Q&A

解決済

1回答

2783閲覧

Unity)ArgumentOutOfRangeExceptionエラー

navesanta

総合スコア198

C#

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

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2019/05/27 07:51

編集2019/05/28 01:00

TextのサイズによってImageサイズが変わるPrefabを生成するアプリを作成しています。

TextのサイズによってImageサイズが変わることについて
先日質問しました回答として VerticalLayoutGroupを設置したImageの子としてTextを配置すれば
良いというのをいただきテスト段階では問題なくうまくいきました。
https://teratail.com/questions/191158

しかしいざPrefab内でその設置をするとエラーになってしまいます。

・下記がPrefab内の配置です。
イメージ説明
・親のCanvasImageの設定です。
イメージ説明
・FukiImageの設定です。
イメージ説明
このFukiImageの設定ですがデフォルではChild Force ExpandのWidthとHeightに
チェックが入っています。
この段階まではコンパイルしてもエラーになりません。

次に子のTextサイズにFukiImageを合わせる(伸縮させる)ためにChild Force Expandのチェックを
両方とも外してChild Controls SizeのWidthとHeightにチェックを入れる(イメージ参照)
と下記のエラーが出ます。

ArgumentOutOfRangeException: Length cannot be less than zero. Parameter name: length System.String.Substring (System.Int32 startIndex, System.Int32 length) (at <ac823e2bb42b41bda67924a45a0173c3>:0) TextExtension.SetTextWithEllipsis (UnityEngine.UI.Text textComponent, System.String value) (at Assets/Scripts/TextExtension.cs:19) ScrollController3.voiceOpen (System.Int32 indexNo, System.Int32 indexItemNo) (at Assets/Scripts/ScrollController3.cs:119) ScrollController3.Start () (at Assets/Scripts/ScrollController3.cs:48)
#pragma warning disable 649 [SerializeField]RectTransform PrefabfukiRed = null; [SerializeField]RectTransform PrefabfukiBlue = null; [SerializeField]Text voiceJTitle; [SerializeField]Text voiceETitle; private RectTransform voicePrefab; [SerializeField]Text voiceCountNum; [SerializeField]Text voiceCountTotal; [SerializeField]Text subETitle; [SerializeField]Text subJTitle; [SerializeField]Entity_catelist ecatelist; [SerializeField]Entity_titlelist etitlelist; [SerializeField]Entity_voicelist evoicelist; private int indexNo; private int indexItemNo; private Image[] cateImages; private Text[] texts; private Image[] images; private int phraseNum; private int startPos;    ・    ・//(省略)    ・ void Start() {  //(省略) //該当箇所) for(int i = startPos; i < startPos + phraseNum; i++){ int parentOrChild = evoicelist.sheets[0].list[i].PorC; if(parentOrChild == 1){ voicePrefab = GameObject.Instantiate(PrefabfukiRed) as RectTransform; }else{ voicePrefab = GameObject.Instantiate(PrefabfukiBlue) as RectTransform; } voicePrefab.SetParent(transform, false); //OnClickVoicePrefabのindexVoiceNoにconverse_idを入れる voicePrefab.GetComponentInChildren<OnClickVoicePrefab>().indexVoiceNo = evoicelist.sheets[0].list[i].converse_id.ToString(); // Debug.Log("converse_id:" + evoicelist.sheets[0].list[i].converse_id); texts = voicePrefab.GetComponentsInChildren<Text>(); images = voicePrefab.GetComponentsInChildren<Image>(); TextExtension.SetTextWithEllipsis(texts[0], evoicelist.sheets[0].list[i].voice_english); TextExtension.SetTextWithEllipsis(texts[1], evoicelist.sheets[0].list[i].voice_japan); } }

翻訳すると要素範囲外のエラー:長さが0もしくは0より小さいのが原因・・・です。
がどこの要素が範囲外になっているのか分かりません。
子の要素が何らかの要因で親に届いていない(0)のでこういうエラーが出ているような
気がしますが原因が調べても分かりません。分かる方ヒントでも結構ですので教えて下さい。

環境)
PC: mac
Unity2018.2
言語:C#

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

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

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

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

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

sakura_hana

2019/05/27 23:55

・プレハブはシーン上に生成されていますか?プロジェクトタブ内ですか? ・「〜のチェックを外して〜のチェックを入れる」というのはインスペクタ上で手動で、ということですか? ・ArgumentOutOfRangeExceptionはどのスクリプトのどの行で発生していますか?(これに連なるエラーを遡っていくと発生元が分かると思います。エディタ上で発生している場合は分からないかもですが……) ・Efuki、Jfuki内のTextコンポーネントに何か文字が入っていますか?
navesanta

2019/05/28 01:01

・プレハブはシーン上に生成されていますか?プロジェクトタブ内ですか? →通常複数生成されるのですがこのエラーが発生する時は1回生成されるだけです。 プレハブの元はProject内のAssetsフォルダ内にPrefabsフォルダを作成してその中に 格納しています。 ・「〜のチェックを外して〜のチェックを入れる」というのはインスペクタ上で手動で、ということですか? →そうです。 ・ArgumentOutOfRangeExceptionはどのスクリプトのどの行で発生していますか?(これに連なるエラーを遡っていくと発生元が分かると思います。エディタ上で発生している場合は分からないかもですが……) →エラーですが下にまだ続きがありました。 そちらも↑記載します。 ・Efuki、Jfuki内のTextコンポーネントに何か文字が入っていますか? →デフォルトのインスペクター上に文字はいれてあります。
guest

回答1

0

ベストアンサー

TextExtension.SetTextWithEllipsis (UnityEngine.UI.Text textComponent, System.String value) (at Assets/Scripts/TextExtension.cs:19)
とあるように、TextExtension.csのSetTextWithEllipsisの19行目が根本的な原因箇所ですね。

ソースの出所は「[Unity] Textコンポーネントでテキストを切り捨てずに全文表示させる方法 - Qiita」でしょうか?
もしそうならupdatedText = value.Substring(0, characterCountVisible - 3);この行が原因だと思います。

つまりLayoutGroupはTextの文字数に応じて領域が拡大縮小するのに、領域に応じてはみ出した文字をカットするスクリプトを入れているので、領域計算が狂って0以下の文字をカットしようとしている(updatedText = value.Substring(0, -3);とかになってる)のではないかと。

このスクリプトを使わない(TextのサイズによってImageサイズを変えているので必要無い気がします)、
もしくは上記処理の前のif文を
if (value.Length > characterCountVisible && characterCountVisible > 3)
などと変更して「Substringの第二引数がマイナスや0にならないようにする」と動くんじゃないかと思います。

投稿2019/05/28 01:37

編集2019/05/28 01:40
sakura_hana

総合スコア11427

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

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

navesanta

2019/05/28 01:55

エラーが解決しました。 仰る通りです。これからもよろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問