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

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

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

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

Unity

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

Q&A

解決済

1回答

1172閲覧

Unity string[int]を代入するとスローされる

ssssggg

総合スコア40

C#

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

Unity

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

0グッド

0クリップ

投稿2019/04/16 11:03

編集2019/04/16 12:15

Unityについてです。
下のコードのように、Textに、string型配列[int型変数]を代入したいのですが、このコードを実行するとシステムがスローされてしまいます。どうすればいいですか?
エラーは出ていません。
(スローは、コードに雷マークが出て、シーンがフリーズするやつです。)
コード


public string[] ITEMnamerist = {"HH","NN"};//名前リスト
int NumI;
K.text = ITEMnamerist[NumI];

ちなみに

K.text = "aaa"; はできました。

K.text = ITEMnamerist[1]; はスローされました。

K.text = その他のstring型の配列[NumI]; はスローされました。

その他のstring型変数 = ITEMnamerist[NumI]; はスローされました。

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

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

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

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

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

fiveHundred

2019/04/16 11:28

システムがスローとはどういう意味でしょうか? もし、エラーのことであれば、質問文にその内容を記載してください。 また、これだけだとITEMnameristやNumIの内容も把握できないので、それらを代入している箇所のソースも記載してください。
fiveHundred

2019/04/16 12:41

> コードに雷マークが出て、シーンがフリーズする こんな事象自体、一度も遭遇したことないのですし、「Unity 雷マーク」などで検索しても何も出てこないです(つまり、遭遇した人がいないか、説明が正しくない)。 そもそも、配列をいじったぐらいでフリーズすることは考えにくいです。 (仮に止まるとしても、エラーになるぐらいだと思います) 画像を添付する、あるいは全体のソースを記載するなどして、もう少し分かるようにしてください。
edo_m18

2019/04/16 13:35

ちなみにですが、一般的に「スローする」と言った場合は「エラーをスローする」というのが普通なので、「エラーが出ていない」っていうのはちょっと違和感があります。
guest

回答1

0

ベストアンサー

NumIに2より大きな数字が入っているか、何も入っていない為にエラーになっているだけのように思います。
(何なら直接ITEMnamerist[2]と入れても「スローされる」と思います)

投稿2019/04/17 06:06

sakura_hana

総合スコア11427

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

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

ssssggg

2019/04/17 14:26 編集

回答ありがとうございました。 質問ですが、コードを改正し、さらに付け加えて下記のように したのですが 、5行目でまたスローされてしまいました。これはどうすればいいですか? _____________________________________________________________________    コード    int NumI; NumI = ITEMNUMrist[0]; K.text = ITEMnamerist[NumI];//スローされない NumI = ITEMNUMrist[1]; K2.text = ITEMnamerist[NumI];//スローされた ITEMnameristは要素の数を10に増やしました。 K2.textは別の新しいテキストです。 ちなみに   NumI = ITEMNUMrist[0]; K.text = ITEMnamerist[NumI]; K2.text = ITEMnamerist[NumI]; や NumI = ITEMNUMrist[0]; K.text = ITEMnamerist[NumI]; NumI = ITEMNUMrist[1]; はスローされませんでした。
sakura_hana

2019/04/18 00:23

ITEMNUMristの中身は何ですか? 例えばITEMnameristの要素が10個で ITEMNUMrist = {0,10} だった場合、 NumI = ITEMNUMrist[0]; //NumIは0 K.text = ITEMnamerist[NumI]; //ITEMnamerist[0]と同じ意味なので問題無い NumI = ITEMNUMrist[1]; //NumIは10(これ自体は正しく取得出来るのでエラーは出ない) K2.text = ITEMnamerist[NumI]; //ITEMnamerist[10]は存在しないのでエラー となります。
sakura_hana

2019/04/18 00:30 編集

あと、質問へのコメントでも指摘されていますが、「スローされる」という言葉の使い方に違和感があります。 スクリプトエディタは何を使っているが知りませんが、エラーの見方を把握した方が自分でデバッグをスムーズに進めることが出来ます。(エラー文を読む・エラー文をググれば解決する問題も結構あるはずなので) ちなみに今回のエラーなら「IndexOutOfRangeException: Array index is out of range.」が出ているかと思います。
ssssggg

2019/04/18 10:06

回答ありがとうございます。 文法があっていればエラーは出ないものだと勘違いしていたので、consleの方にこのエラーが出ていて気づきませんでした。申し訳ございませんでした。 ITEMNUMrist,ITEMnameristはこうなっています。 public string[] ITEMnamerist = {"HH","NN", "g", "x", "y", "v", "r", "u", "s", "k" }; public int[] ITEMNUMrist = {1,2,3,4,5,6,7,8,9,10}; ITEMnameristは3番目はあるのでここは問題じゃないと思います。 後、コードにDebug.Logを加えて試したら、こうなりました。 コード Debug.Log(NumI+","+ ITEMnamerist); K2.text = ITEMnamerist[1]; 検出結果 2,NN コード Debug.Log(NumI+","+ ITEMnamerist[NumI]); K2.text = ITEMnamerist[1]; これはエラーが出て検出できませんでした。
sakura_hana

2019/04/18 10:26

Debug.Log(NumI+","+ ITEMnamerist); これの結果は 2,NN こうはならないはずです。 ITEMnameristは配列なので「2,System.String[]」と表示されるはずです。 こう表示されるということは、コードの途中で string ITEMnamerist = "NN"; としていないでしょうか?(つまり変数の上書きです) この場合、これ以降ITEMnameristは配列ではなくstringになる為、NumlがITEMnameristの文字数以上場合エラーになります(Numlが2、ITEMnameristが"NN"なら配列オーバーでエラーです)。 ちなみにNumlがITEMnameristの文字数未満だった場合、char型の値が返って来ます。 (上記の通りなら、ITEMnamerist[1]は「N」というchar型の値になる) よってDebug.Logは正常に動作しますが(多分「1,N」などと表示されるでしょう)、 K2.text = ITEMnamerist[1]; の行で 「string型の変数(K2.text)にchar型(ITEMnamerist[1])は入らないよ」というエラーが出されるはずです。
ssssggg

2019/04/18 10:36 編集

すみません。編集前のコードをコピペしていました。 Debug.Log(NumI+","+ ITEMnamerist[1]); が正しいコードです。迷惑をかけてしまいすみませんでした。
sakura_hana

2019/04/18 10:40

エラーが出る方のコードでも、Numlは確実に2でしょうか? また、エラー文をそのままコピペしてください。
ssssggg

2019/04/18 11:05

エラー文はこれです。 IndexOutOfRangeException: Array index is out of range. BattleManager.ITH () (at Assets/BattleScene/Battle comand texture/BattleManager.cs:825) ITEMR+<Hyouzi>c__Iterator0.MoveNext () (at Assets/ITEMR.cs:52) UnityEngine.SetupCoroutine.InvokeMoveNext (IEnumerator enumerator, IntPtr returnValueAddress) (at /Users/builduser/buildslave/unity/build/Runtime/Export/Coroutines.cs:17)
sakura_hana

2019/04/18 11:09

やっぱり配列オーバーですね。 Debug.Log(NumI+","+ ITEMnamerist[NumI]); ↑の行を Debug.Log(NumI+","+ ITEMnamerist.Length); に書き換えるとどう表示されますか?
ssssggg

2019/04/18 11:17

10と表示されます。
sakura_hana

2019/04/18 11:24

どちらがですか? 数字が2つ出て来るはずですが。
ssssggg

2019/04/18 11:29

すみません。2と2でした。疲れているようなので少し休みます。
ssssggg

2019/04/18 12:14

お待たせいたしました。続きをお願いします。
vo3

2019/04/18 15:05

あなたが言われている「スローされない」状態のとき、K.textやK2.textに設定された文字はあなたが意図した文字になっていますか? そのうえで不明なら、今このやり取りで行われている要素数10の状態のソース全文(余計なものは除いて)を、質問内容に改めて追記してみてはどうですか?
sakura_hana

2019/04/18 23:59

NumIが2 ITEMnamerist.Lengthも2 ということは、ITEMnamerist[2]は存在しないのでエラーになります。 (配列は0番から始まるので、ITEMnamerist[0]とITEMnamerist[1]しか存在しない) 可能性があるとすると、 ・ITEMnameristを最初の宣言より後に ITEMnamerist = {"HH","NN"} などと書き換えている(他のスクリプトからの編集も含む) ・ITEMnameristをUnityのインスペクタから編集している(スクリプトの記述は初期値なので、インスペクタで配列数を変えるとそっちが優先される) あたりが考えられます。
ssssggg

2019/04/19 06:00

回答ありがとうございます。 Unityのインスペクタで変更していました。 長い時間お付き合いいただき本当にありがとうございました!
sakura_hana

2019/04/19 06:38

解決して何よりです。 ちなみに「配列.Length」は「配列の大きさ(要素数)」という意味です。IndexOutOfRangeExceptionが出た場合は最初に確認するといいと思います。(インスペクタ優先なのをすっかり忘れていて、要素数10だとばかり思っていたので提示が遅くなりましたが)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問