実現したいこと
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パターン)に実行したいのが、質問のスクリプトの内容です。
回答3件
あなたの回答
tips
プレビュー