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

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

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

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

C#

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

Unity

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

3回答

3095閲覧

他のスクリプトから配列の情報を取得し、短くコードを書きたい

退会済みユーザー

退会済みユーザー

総合スコア0

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

C#

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

Unity

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/08/30 15:48

編集2021/08/31 00:54

実現したいこと

Unityで他のオブジェクトにアタッチしたスクリプトからbool配列を取得し、別のスクリプトで使いたいです。下記のrightbar[]とleftbar[]の[]には0から8までの数字がそれぞれ入ります。rightbar[0], leftbar[1]・・・のように、全部で9×9=81個のコピペを書けば処理としては成立するのですが、もっとスマートに書ける方法がある気がしてなりません。

(例としてrightbar[0]とleftbar[0]の場合を記載します)。

using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerManager : MonoBehaviour { public GameObject migimigiba; public GameObject hidarihidariba; public GameObject a; public GameObject b; void Start() { migimigiba = GameObject.Find("migiba"); hidarihidariba = GameObject.Find("hidariba"); b.SetActive(false); } // Update is called once per frame void Update() { if (migimigiba.GetComponent<BluebarMove>().rightbar[0] == true && hidarihidariba.GetComponent<RedbarMove>().leftbar[0] == true) { a.SetActive(false); b.SetActive(true); } if (migimigiba.GetComponent<BluebarMove>().rightbar[0] == false && hidarihidariba.GetComponent<RedbarMove>().leftbar[0] == false) { a.SetActive(true); b.SetActive(false); } else if (migimigiba.GetComponent<BluebarMove>().rightbar[0] == false || hidarihidariba.GetComponent<RedbarMove>().leftbar[0] == false) { a.SetActive(true); b.SetActive(false); } } }

if文で実行したい処理は全て同じ内容です。

質問内容をまとめると、「計81個に及ぶ処理を簡単に済ませるには、どのような方法がベストでしょうか?」

追記・補足情報

void Update() { for (int i = 0; i <= 8; i++) { for (int j = 0; j <= 8; j++) { if (migimigiba.GetComponent<BluebarMove>().rightbar[i] == true && hidarihidariba.GetComponent<RedbarMove>().leftbar[j] == true) { a.SetActive(false); b.SetActive(true); } else { a.SetActive(true); b.SetActive(false); } } } }

とプログラムを変更しましたが、rightbar[0], leftbar[0]のときしか処理が実行されませんでした(rightnumrandom = 1, leftnumrandom = 1にしたら処理が実行、それ以外のrightnumrandom = 2などでは処理が実行されず)。エラーは出ないのでプログラム自体は正しいと思われるのですが、他の部分にミスがあるかもしれないので、別スクリプトのコードを補足情報として記載します。

1.まず、1から9までの数字をランダムに決め、出た数字に合わせてbool型 rightarea,leftareaをtrueにします。

public class NumberController : MonoBehaviour { public Text rightnum; public Text leftnum; public int rightnumrandom; public int leftnumrandom; public bool[] rightarea = new bool[9]; public bool[] leftarea = new bool[9]; // Start is called before the first frame update void Start() { for (int i = 0; i <= 8; i++) { rightarea[i] = false; } for (int i = 0; i <= 8; i++) { leftarea[i] = false; } rightnumrandom = Random.Range(1, 10); //rightnumrandom = 1; this.rightnum = GameObject.Find("RightNumText").GetComponent<Text>(); rightnum.text = rightnumrandom.ToString(); leftnumrandom = Random.Range(1, 10); //leftnumrandom = 1; this.leftnum = GameObject.Find("LeftNumText").GetComponent<Text>(); leftnum.text = leftnumrandom.ToString(); } // Update is called once per frame void Update() { if (rightnumrandom == 1) { rightarea[0] = true; Debug.Log("右1"); } //補足・・・rightarea[1]からrightarea[8]の処理(if文)も同じなので、割愛 if (leftnumrandom == 1) { leftarea[0] = true; Debug.Log("左1"); } //補足・・・leftarea[1]からleftarea[8]の処理(if文)も同じなので、割愛 } }

2.次に、rightarea, leftareaの判定結果を元に、bool型 rightbar, leftbarをtrueまたはfalseにします。rightbarとleftbarはそれぞれ別のスクリプトで管理しており、内容はrightとleftの違いだけなので、以下にrightのときのスクリプトを記載します。

public class BluebarMove : MonoBehaviour { GameObject rightleftnum; public bool[] rightbar = new bool[9]; bool push = false; GameObject Migibar; void Start() { rightleftnum = GameObject.Find("RightLeftNum"); Migibar = GameObject.FindGameObjectWithTag("migibar"); for (int i = 0; i <= 8; i++) { rightbar[i] = false; } } public void PushDown() { push = true; } public void PushUp() { push = false; } // Update is called once per frame void Update() { if ((push == true) && (Migibar.transform.position.x > 1.41f)) { Migibar.transform.Translate(-0.01f, 0, 0); } else if ((push == true) && (Migibar.transform.position.x <= 1.41f)) { Migibar.transform.Translate(0, 0, 0); } else if ((push == false) && (Migibar.transform.position.x < 4.18f)) { Migibar.transform.Translate(0.007f, 0, 0); } else if ((push == false) && (Migibar.transform.position.x >= 4.18f)) { Migibar.transform.Translate(0, 0, 0); } Transform myTransform = this.transform; Vector3 migibapos = myTransform.position; if (rightleftnum.GetComponent<NumberController>().rightarea[0] == true) { if(migibapos.x <= 3.551f && migibapos.x >= 3.32f) { rightbar[0] = true; Debug.Log("OK右1"); } else if(migibapos.x < 3.32f || migibapos.x > 3.551f) { rightbar[0] = false; Debug.Log("はずれた右1"); } } if(rightleftnum.GetComponent<NumberController>().rightarea[1] == true) { if (migibapos.x <= 3.32f && migibapos.x >= 3.089f) { rightbar[1] = true; Debug.Log("OK右2"); } else if (migibapos.x < 3.089f || migibapos.x > 3.32f) { rightbar[1] = false; Debug.Log("はずれた右2"); } } if (rightleftnum.GetComponent<NumberController>().rightarea[2] == true) { if (migibapos.x <= 3.089f && migibapos.x >= 2.858f) { rightbar[2] = true; Debug.Log("OK右3"); } else if (migibapos.x < 2.858f || migibapos.x > 3.089f) { rightbar[2] = false; Debug.Log("はずれた右3"); } } if (rightleftnum.GetComponent<NumberController>().rightarea[3] == true) { if (migibapos.x <= 2.858f && migibapos.x >= 2.627f) { rightbar[3] = true; Debug.Log("OK右4"); } else if (migibapos.x < 2.627f || migibapos.x > 2.858f) { rightbar[3] = false; Debug.Log("はずれた右4"); } } if (rightleftnum.GetComponent<NumberController>().rightarea[4] == true) { if (migibapos.x <= 2.627f && migibapos.x >= 2.396f) { rightbar[4] = true; Debug.Log("OK右5"); } else if (migibapos.x < 2.396f || migibapos.x > 2.627f) { rightbar[4] = false; Debug.Log("はずれた右5"); } } if (rightleftnum.GetComponent<NumberController>().rightarea[5] == true) { if (migibapos.x <= 2.396f && migibapos.x >= 2.165f) { rightbar[5] = true; Debug.Log("OK右6"); } else if (migibapos.x < 2.165f || migibapos.x > 2.396f) { rightbar[5] = false; Debug.Log("はずれた右6"); } } if (rightleftnum.GetComponent<NumberController>().rightarea[6] == true) { if (migibapos.x <= 2.165f && migibapos.x >= 1.934f) { rightbar[6] = true; Debug.Log("OK右7"); } else if (migibapos.x < 1.934f || migibapos.x > 2.165f) { rightbar[6] = false; Debug.Log("はずれた右7"); } } if (rightleftnum.GetComponent<NumberController>().rightarea[7] == true) { if (migibapos.x <= 1.934f && migibapos.x >= 1.703f) { rightbar[7] = true; Debug.Log("OK右8"); } else if (migibapos.x < 1.703f || migibapos.x > 1.934f) { rightbar[7] = false; Debug.Log("はずれた右8"); } } if(rightleftnum.GetComponent<NumberController>().rightarea[8] == true) { if (migibapos.x <= 1.703f && migibapos.x >= 1.472f) { rightbar[8] = true; Debug.Log("OK右9"); } else if (migibapos.x < 1.472f || migibapos.x > 1.703f) { rightbar[8] = false; Debug.Log("はずれた右9"); } } } }

3.rightbarとleftbarがそれぞれtrueのとき(計81パターン)に実行したいのが、質問のスクリプトの内容です。

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

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

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

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

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

YAmaGNZ

2021/08/31 00:12

rightbarやleftbarをループでチェックするのはいいですが、操作対象が1つって何か意味があるのでしょうか? aやbは最終判断の結果のみになりませんか?
退会済みユーザー

退会済みユーザー

2021/08/31 00:39

コメント頂きありがとうございます。説明不足ですみません。 やりたいことが明確に伝わるよう、質問内容を編集しました。
guest

回答3

0

具体的のどのようなことがしたいのかがわからないのですが、これに関わりそうで、もっとスマートに行くコードなら多分こんな感じです

まず①

C#

1bool a = false; 2 3if(a) 4{ 5 //処理~ 6}

bool型の変数aがtrueの時これが実行されます。つまり「 == true」を書かなくてもよいということです。
もしfalseの時の場合が書きたければ「!a」とすれば実行されます。

その②

C#

1public List<bool> boolList; 2//↓はUnity上での操作もしくはAddで追加 3//boolList 0 true 4//boolList 1 false 5// 2 true 6// 3 true 7 8var count = 0 9 10for (int i = 0; i > 81; i++) 11{ 12 a.SetActive(boolList[count]); 13 count++; 14} 15 16if(list[player.aList[h]] = numberList[h]){ } //内容の変数等は適当です

とこのように配列は結構無理やりでもできて、配列の中に配列を入れたり、ほかのスクリプトの配列を入れたりなど結構融通が利きます。
どんなことをしようとしているのかは申し訳ですが、わかりません。でも、これを使えば何番目がtrueだったらaにlistの何番目の数字を代入するみたいなことができるので、少し便利だと思います。
もし御存じなのであれば大変失礼いたします。
もし、まだ目的が達成されないのであれば、どのようなことがしたいのか具体的な内容の補足をお願いします。

投稿2021/08/31 14:32

obasuteyama-

総合スコア43

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

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

退会済みユーザー

退会済みユーザー

2021/08/31 14:39

せっかく回答して頂いたのに申し訳ないのですが、つい先ほど質問内容の目的が達成できましたので、解決済みとさせて頂きます。配列は苦手分野だったので、今後の参考とします!
obasuteyama-

2021/08/31 14:50

そうですか笑 それは良かったです(*ˊᵕˋ*)
guest

0

ベストアンサー

C#

1 if (rightleftnum.GetComponent<NumberController>().rightarea[0] == true) 2 { 3 if(migibapos.x <= 3.551f && migibapos.x >= 3.32f) 4 { 5 rightbar[0] = true; 6 Debug.Log("OK右1"); 7 } 8 else if(migibapos.x < 3.32f || migibapos.x > 3.551f) 9 { 10 rightbar[0] = false; 11 Debug.Log("はずれた右1"); 12 } 13 }

この部分の3.551fや3.32fを配列化すればループできるようになるかと思います。
(提示したソースは動作確認していません。あくまでイメージです)

C#

1 2var numbercontroller = rightleftnum.GetComponent<NumberController>(); 3var aria = {3.551f,3.32f,3.089f,2.858f・・・・} 4 5for(int i = 0; i < 10; i++) 6{ 7 if (numbercontroller.rightarea[i] == true) 8 { 9 if(aria[i + 1] < migibapos.x && migibapos.x <= aria[i]) 10 { 11 rightbar[i] = true; 12 Debug.Log($"OK右{i+1}"); 13 } 14 else 15 { 16 rightbar[i] = false; 17 Debug.Log($"はずれた右{i+1}"); 18 } 19 } 20} 21

ただ、変数名からすると左右に9個ずつの列があるように思えます。
(順番は違うかもしれませんが下記のようなイメージに思えます)
|左3|左2|左1|右1|右2|右3|
|:--|:--:|--:|
||||

これを行列のように81通りというのがよく分かりません。

蛇足かもしれませんがNumberControllerクラスのほうで
Updateメソッド内でrightnumrandom==1と判定していますが、rightnumrandomはStartメソッドにてrightnumrandomを乱数からセットしているだけで変化しませんがいいのでしょうか?


追記

今一理解し切れていないのですがmigibapos.xの値によっての条件判断のようですから1~9の複数がヒットすることはないと思います。
なので

C#

1if (migibapos.x <= 3.551f && migibapos.x >= 1.472f) 2{ 3 int nowPosition = (int)((3.551f- migibapos.x) / 0.231f); 4 for (int i = 0; i < rightbar.Length; i++) rightbar[i] = false; 5 6 if(rightarea[nowPosition] == true) 7 { 8 rightbar[nowPosition] = true; 9 Debug.Log($"右{nowPosition + 1} OK"); 10 } 11 else 12 { 13 Debug.Log("右なし"); 14 } 15} 16else 17{ 18 Debug.Log("右なし"); 19}

といった感じでmigibapos.xからどの位置に該当するか計算し、そこが有効なのかという方法でいいように思えます。
そうすればループする必要もなくなりますしleftareaも同様に求めて、それが有効なのか調べればいいように思います。
どうしても9X9の判断が必要であれば、takasima20さんの仰るように2重ループで処理を行うのがいいでしょう。

投稿2021/08/31 01:44

編集2021/08/31 05:48
YAmaGNZ

総合スコア10294

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

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

退会済みユーザー

退会済みユーザー

2021/08/31 04:40

『これを行列のように81通りというのがよく分かりません。』 ↓ 例えば、大小2つのサイコロの出る目の場合の数が6×6=36通りあるのと同じで、(rightbar[0]=trueかつleftbar[0]=trueのとき、rightbar[0]=trueかつleftbar[1]=trueのとき、・・・・rightbar[0]=trueかつleftbar[8]=trueのとき、rightbar[1]=trueかつleftbar[0]=trueのとき、・・・rightbar[8]=trueかつleftbar[8]=trueの計9×9=81通りという意味です。 『rightnumrandomはStartメソッドにてrightnumrandomを乱数からセットしているだけで変化しませんがいいのでしょうか?』 ↓ ある条件のときにrightnumrandomとleftnumrandomをリセットし、新たにランダムな数字をセットする仕組みを作るつもりで、まだ「ある条件」の部分が完成していないため、現段階ではStartメソッドで1回だけランダムな数字が選ばれる仕様にしています。テストでUnity側のスタートボタンを押し、左3, 右4のように毎回ランダムな数字を出現させ、どの数字の組み合わせでもちゃんと処理が実行されるか確認中、というのが現状です。
退会済みユーザー

退会済みユーザー

2021/08/31 12:04

二重ループと3.551fや3.32fなどの配列化により、9×9個の処理を行うことには成功しましたが、最後のSetActiveの処理が実行されません。aはアニメーションありのGameObject、bはアニメーションなしのGameObjectです。具体的な症状としては、Game画面上にて、if文が実行されるとaのアニメーションは静止するがfalseにはならない(bはtrueにならない)、elseが実行されるとaのアニメーションが再び動き出す。非アクティブ状態のGameObjectを呼び出すためにAwake()などを使ってみたのですが、駄目でした。 もし解決策に心当たりがあれば教えて頂きたいです。また、原因が本質問のタイトルとは無関係なら、本質問は解決済みにしたいと思います。 スクリプト一部抜粋 if(割愛) { a.SetActive(false); b.SetActive(true); } else { a.SetActive(true); b.SetActive(false); }
YAmaGNZ

2021/08/31 12:54

どこでその処理をやっているのか知りませんが、ループ内でやってるとしたら最後のループの結果だったりしませんか? 適切ではないソースの抜粋は正確に意図が伝わらないので行き違いの原因になるでしょう。
退会済みユーザー

退会済みユーザー

2021/08/31 14:36

親切に回答していただき、ありがとうございました。本質問の目的自体は達成できたので、SetActive等の話はここではしないことにします。
guest

0

対象がふたつなのでループもふたつにします。

c#

1void Update() 2 { 3 for(int i = 0; i <= 8; i++) 4 { 5 for(int j = 0; j <= 8; j++) 6 { 7 if (migimigiba.GetComponent<BluebarMove>().rightbar[i] == true && hidarihidariba.GetComponent<RedbarMove>().leftbar[j] == true) 8 { 9 a.SetActive(false); 10 b.SetActive(true); 11 } 12 13 if (migimigiba.GetComponent<BluebarMove>().rightbar[i] == false && hidarihidariba.GetComponent<RedbarMove>().leftbar[j] == false) 14 { 15 a.SetActive(true); 16 b.SetActive(false); 17 } 18 else if (migimigiba.GetComponent<BluebarMove>().rightbar[i] == false || hidarihidariba.GetComponent<RedbarMove>().leftbar[j] == false) 19 { 20 a.SetActive(true); 21 b.SetActive(false); 22 } 23 } 24 } 25 } 26}

さらに、コードの意味合いからするとこれでもいけそうですが?

c#

1void Update() 2 { 3 for(int i = 0; i <= 8; i++) 4 { 5 for(int j = 0; j <= 8; j++) 6 { 7 if (migimigiba.GetComponent<BluebarMove>().rightbar[i] == true && hidarihidariba.GetComponent<RedbarMove>().leftbar[j] == true) 8 { 9 a.SetActive(false); 10 b.SetActive(true); 11 } else { 12 a.SetActive(true); 13 b.SetActive(false); 14 } 15 } 16 } 17 } 18}

投稿2021/08/30 21:59

takasima20

総合スコア7460

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

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

退会済みユーザー

退会済みユーザー

2021/08/31 00:45

コメント頂きありがとうございます。アドバイスの通りプログラムを変更したところ、rightbar[0], leftbar[0]のときだけ実行され、それ以外では実行されませんでした。エラーは出ていないので、他のスクリプトに問題があるのかもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問