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

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

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

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

Unity3D

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

Unity

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

Q&A

解決済

5回答

15021閲覧

bool型の配列では値をそれぞれ参照できないのか | コードはこれで合っているのか

_Beginner

総合スコア103

C#

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

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2018/12/23 10:00

編集2018/12/23 12:54

C#

1//これを配列にする理由は、一つずつbool変数の名前と値を書いていくのがめんどくさいから 2bool[] arrayBool = { true }; 3 4//敵を倒すとポイントが増える(1ずつとは限らない) 5int point = 0; 6 7void Point() 8{ 9 if(arrayBool[0] == true) 10 { 11 if(point >= 1) 12 { 13 Debug.Log("arrayBool[0] == true"); 14 arrayBool[0] = false; 15 } 16 } 17 18 if(arrayBool[1] == true) 19 { 20 if(point >= 2) 21 { 22 Debug.Log("arrayBool[0] == true"); 23 arrayBool[1] = false; 24 } 25 } 26 27 //これが全部で7回続く ~arrayBool[7] 28}

###コードについて追記
__if(arrayBool[n] == true)__はその中のif文を一度しか処理しないために組んだものです。
順序としては、arryaBool[]の7個の変数がすべてtrueであり、ある一定のpointが貯まると__if(point >= x)__内が実行され、arrayBool[n]をfalseにすることによってそれを今後処理しないようにします。


これで**Point()**が呼ばれたときにデバッグのログを出したいのですが、エラーが出ます。

正直言うと配列のことをあまり理解できていなくて誤解していると自分でも思っています。

配列とは、多くなってしまう変数を一つの変数からまとめて管理できるようにしたもので、
対象物が多いときに配列を使うと便利なもの。

という認識ですがこの考え方はあってるのでしょうか?

エラーも出ています。


IndexOutOfRangeException: Index was outside the bounds of the array.

エラー範囲はちょうどif文のところです。


どなたか回答お願いします。

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

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

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

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

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

ozwk

2018/12/23 12:05

他で配列に代入してません?
_Beginner

2018/12/23 12:27

多分していないと思います。 arrayBool[]が関わっているコードは編集で付け足しました。
ozwk

2018/12/23 12:34 編集

多分エラーが出たのは[1]の方ですよね?
guest

回答5

0

if (arrayBool[0] == true) {

の前に、

C#

1 if (arrayBool.Length < 1) { 2 Debug.Log("arrayBool.Length is 0"); 3 //Console.WriteLine("arrayBool.Length is 0"); 4 return; 5 }

としたら、どうなるでしょう?

多分、"arrayBool.Length is 0" が出力されるのでは?

[追記]
もしかして、

if(arrayBool[1] == true)

でエラーが起きていませんか?

bool[] arrayBool = { true };

の宣言では、配列の長さは、 1です。 arrayBool[1] の参照はエラーとなります。

投稿2018/12/23 12:10

編集2018/12/23 12:34
pepperleaf

総合スコア6383

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

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

_Beginner

2018/12/23 12:18

コンソールのデバッグはONにしていますが それは出力されませんでした。 arrayBoolの個数は1以上あるということになります?
pepperleaf

2018/12/23 12:28 編集

> arrayBoolの個数は1以上あるということになります? 1つも無いという事です。 手元の確認では、 > static bool[] arrayBool = {}; としました。 どこかで類似の処理をしていると思います。 > //Console.WriteLine("arrayBool.Length is 0"); これは、単に、コマンドラインで、 Debug.Log() がエラーになったのでその代用。特に意味は無いです。
_Beginner

2018/12/23 12:46 編集

試しに宣言部分のコードを readonly bool[] IncreaseDifficultyLevel = { true, true, true, true, true, true, true }; に変えてみた(これだと個数が7個ある...?)のですが、 いつものエラーが出ます。 --- >bool[] arrayBool = { true }; の宣言では、配列の長さは、 1です。 arrayBool[1] の参照はエラーとなります。 これはつまり arrayBool[0]の値がtrueでarray[1]は宣言されていないということですか? 語彙力&理解力なくてごめんなさい
pepperleaf

2018/12/23 12:55 編集

変えるならば、 > bool[] arrayBool = { true, true, true, true, true, true, true, true }; ではないでしようか? (arrayBool[7] だったら、 8個) また、 > readonly bool[] IncreaseDifficultyLevel とすると、 IncreaseDifficultyLevel[1] = false; とかはエラーになりますが、誤解してないですか?
guest

0

IndexOutOfRange はインデクスの範囲外にアクセスしたときに出る例外です。
この場合、インデクス 0 にアクセスしているので、何か一つでも要素が入っていたら出ません。
ということは、初期化するタイミングが悪いために配列に何も入っていないと言うことです。
もう少し広い範囲のコード見なければどのように修正すれば良いか判断ができませんが、初期化される前にアクセスされています。

#追記

if(arrayBool[1] == true)

ここで出ているのでは?

投稿2018/12/23 11:54

編集2018/12/23 12:27
Zuishin

総合スコア28660

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

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

Zuishin

2018/12/23 11:56 編集

または、別のところで別の配列を入れています。null でないところを見るとこちらかもしれません。
_Beginner

2018/12/23 12:56

>別のところで配列を入れる というのは、arrayBool[n] = true を別のところで行っているということですか?
Zuishin

2018/12/23 12:59

ソースが無いのでどこで何をしているのかわかりません。可能性の話です。 その後質問が編集されたのでそれを見て追記しました。 まずどこで例外が起こっているのかを確認してください。
pepperleaf

2018/12/23 13:03

> 例外が起こっているのか 例外が起きている正確な場所(コード位置)ですね。
Zuishin

2018/12/23 13:04

そうですね。エラーメッセージに行番号が書いてあると思うのですが。
guest

0

bool[] arrayBool = new bool[]{ true };

投稿2018/12/23 10:21

y_waiwai

総合スコア87774

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

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

_Beginner

2018/12/23 11:48

同じくIndexOutOfRangeException: Index was outside the bounds of the array.というエラーが出ます
y_waiwai

2018/12/23 12:06

それ、なんかおかしなことになってますな コード全体を提示できない?
_Beginner

2018/12/23 12:25 編集

arrayBool[]が関わっているところを書きました。 poin整数型は敵を倒したりしたときに手に入れるものです。 これらのif文はレベルアップ時の報酬みたいなもので、一度レベルアップしたらその処理は二度と起こさないようにするために組んでいます。
y_waiwai

2018/12/23 12:29

arrayBool自体にどっかで代入してませんか? VisualStudioなら、要所で止めて変数の内容モニタできるんで、どこでarrayBoolが変わるのか追いかけてみれば?
guest

0

自己解決

他の回答者さんも言ってくれたように、配列に何も入っていない状態でした。
僕の理解力が乏しくなかなか答えにたどり着けませんでしたがようやく解決できました。
本当にありがとうございました!
今後も無知な質問ばかりしてしまうと思いますがよろしくおねがいします。

どの回答もとても勉強になり解決への助けになりました。
ベストアンサーに迷ったのですが、最後はこちらで最終的なコードを添付してクローズさせていただこうと思います。

以下コード

c#

1//これを配列にする理由は、一つずつbool変数の名前と値を書いていくのがめんどくさいから 2bool[] arrayBool = new bool[] { true, true, true, true, true, true, true, true, true }; 3 4//敵を倒すとポイントが増える(1ずつとは限らない) 5int point = 0; 6 7//ポイントが増えた際に呼ばれる 8void Point() 9{ 10 if(arrayBool[0] == true) 11 { 12 if(point >= 1) 13 { 14 Debug.Log("arrayBool[0] == true"); 15 arrayBool[0] = false; 16 } 17 } 18 19 if(arrayBool[1] == true) 20 { 21 if(point >= 2) 22 { 23 Debug.Log("arrayBool[0] == true"); 24 arrayBool[1] = false; 25 } 26 } 27 28 //これが全部で7回続く ~arrayBool[7] 29}

投稿2018/12/23 13:29

編集2018/12/23 14:24
_Beginner

総合スコア103

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

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

y_waiwai

2018/12/23 13:39

グローバルとstartの中でnewしてますがこれは無駄です start関数が必ず実行されるなら、そこだけでnewさせればいいです
_Beginner

2018/12/23 14:23

なるほど 修正させていただきます! 宣言と初期化を同時にしちゃいます。
guest

0

bool[] arrayBool = new bool[2];
又は
bool[] arrayBool = new bool[]{true,true, true,true, true,true,true };

配列はnewしたときのサイズで固定なのでサイズ以上のindexは使えません

ちなみにpublic List<bool> arrayBoolまたは[SerializeField]private List<bool> arrayBoolを使えば(newはしない)unityのインスペクターから初期値を指定できます

投稿2018/12/23 13:03

編集2018/12/23 13:12
bochan2

総合スコア2050

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

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

Zuishin

2018/12/23 13:05

> //これが全部で7回続く ~arrayBool[7] らしいです。
bochan2

2018/12/23 13:07

ご指摘ありがとうございます 編集しておきます
_Beginner

2018/12/23 13:08

bool[] arrayBool = new bool[7]; もしくは bool[] arrayBool = new bool[]{true,true,true,true,true,true,true,true}; つまり bool[] arrayBool = new Bool[7]; を宣言して Startメソッドなどで bool[] arrayBool = new bool[]{true,true,true,true,true,true,true,true}; を定義してやればいいのでしょうか?
bochan2

2018/12/23 13:13

bool[] arrayBool = new bool[]{true,true,true,true,true,true,true,true};はstaticでなくても使えますよ
_Beginner

2018/12/23 13:22

上のように最初に宣言、Startメソッドで定義した所、理由はよくわかりませんがうまくいきました! 他の回答者さんも言ってくれたように、配列に何も入っていない状態でした。 僕の理解力が乏しくなかなか答えにたどり着けませんでしたがようやく解決できました。 本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問