実現したいこと
Unityで2Dゲームを開発中で、aというGameObject(アニメーション付き)とbというGameObject(アニメーションなし)を、あるif文の条件式で表示または非表示にうまく切り替えることが目的です。
発生している問題・エラーメッセージ
エラー表示は特になく、Unity上でゲームを再生することは可能です。なので、原因はプログラミングによるエラーではないと考えられますが(Debug.Logで指示を書きたい領域が機能しているかをすでに確認済)、原因の箇所が全く分からずにいます。
<具体的な症状>
・以下のスクリプト参照
if(割愛)
{
ToBchange();
}
において、aはGame画面上に表示されたままアニメーションはなぜか静止する。bはGame画面上に表示されない。
else
{
ToAchange();
}
において、aはGame画面上に表示されたままアニメーションが再び動き出す。bはGame画面上に表示されない
<理想>
if(割愛)
{
ToBchange();
}
において、aはGame画面上から消え、bはGame画面上に表示される。
else
{
ToAchange();
}
において、aはGame画面上に表示され、bはGame画面上から消える。
該当のソースコード
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class PlayerManager : MonoBehaviour 6{ 7 public GameObject migimigiba; 8 public GameObject hidarihidariba; 9 10 [SerializeField] GameObject a; 11 [SerializeField] GameObject b; 12 13 14 void Start() 15 { 16 migimigiba = GameObject.Find("migiba"); 17 hidarihidariba = GameObject.Find("hidariba"); 18 } 19 20 // Update is called once per frame 21 void Update() 22 { 23 for (int i = 0; i <= 8; i++) 24 { 25 for (int j = 0; j <= 8; j++) 26 { 27 if (migimigiba.GetComponent<BluebarMove>().rightbar[i] == true && hidarihidariba.GetComponent<RedbarMove>().leftbar[j] == true) 28 { 29 ToBchange(); //Debug.Logで確認済 問題なし 30 } 31 else 32 { 33 ToAchange(); //Debug.Loでg確認済 問題なし 34 } 35 } 36 } 37 38 39 public void ToBchange() 40 { 41 a.SetActive(false); 42 b.SetActive(true); 43 } 44 45 public void ToAchange() 46 { 47 a.SetActive(true); 48 b.SetActive(false); 49 } 50 51}
試したこと
Debug.Logで指定の領域がちゃんと機能していることは確認済みです。エラーもないです。 [SerializeField] で書けば非アクティブ状態のオブジェクトも取得できるとの情報があったので、そうしましたが、目的は達成できませんでした。となると、SetActiveの使い方が間違っているのでしょうか?
追記
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class PlayerManager : MonoBehaviour 6{ 7 public GameObject migimigiba; 8 public GameObject hidarihidariba; 9 10 GameObject a; 11 GameObject b; 12 13 14 void Start() 15 { 16 migimigiba = GameObject.Find("migiba"); 17 hidarihidariba = GameObject.Find("hidariba"); 18 a = GameObject.Find("A"); 19 b = GameObject.Find("B"); 20 } 21 22 // Update is called once per frame 23 void Update() 24 { 25 if(migimigiba.GetComponent<BluebarMove>().rightbar[0] == true && hidarihidariba.GetComponent<RedbarMove>().leftbar[0] == true) 26 { 27 a.transform.position = new Vector3(-4.2f, -0.19f, 0); 28 b.transform.position = new Vector3(-1.6f, -0.19f, 0); 29 } 30 else 31 { 32 a.transform.position = new Vector3(-1.63f, -0.19f, 0); 33 b.transform.position = new Vector3(-4.13f, -0.19f, 0); 34 } 35 36 if (migimigiba.GetComponent<BluebarMove>().rightbar[0] == true && hidarihidariba.GetComponent<RedbarMove>().leftbar[1] == true) 37 { 38 a.transform.position = new Vector3(-4.2f, -0.19f, 0); 39 b.transform.position = new Vector3(-1.6f, -0.19f, 0); 40 } 41 else 42 { 43 a.transform.position = new Vector3(-1.63f, -0.19f, 0); 44 b.transform.position = new Vector3(-4.13f, -0.19f, 0); 45 } 46 というような感じで同じような処理が続いていきます。 47 } 48}
というような感じで、for文ではなく上記のように(rightbar[0]かつleftbar[0]のとき,rightbar[0]かつleftbar[1]のとき, rightbar[0]かつleftbar[2]のとき ・・・と個別に処理を書くと目的の動作が実行されました。for文だとi=8, j=8の最後の処理しか実行されないとの指摘を受け、まさにその通りでした。
ただ、これだと(rightbar[0]かつleftbar[0]~rightbar[8]かつleftbar[8]の計81個の処理をコピペする必要があり、もっとスマートに書ける処理を考え中です。)
この記載しているスクリプト内で処理が完結できればいいなと思っています。
回答4件
あなたの回答
tips
プレビュー