質問: this.GetComponentInChildren(); // 文字列が指定されたいずれかの文字列と等しいかどうかを返す拡張メソッドを使ってます // 正解の場合 if (answer.text.IsAny("A", "B", "C")) { //「ボタン」を表示させる GameObject.Find("Quiz").transform.Find("Button").gameObject.SetActive(true); } // 不正解の場合 else { //「ボタン」を表示させる GameObject.Find("Quiz").transform.Find("Button").gameObject.SetActive(true); } ``` ### 疑問 何が原因で、二回押さないと出てこないかが分かりません。 ここに書いた以外のコードが影響しているのでしょうか? ヒントでも頂けるのであれば嬉しいです。 ### 質問に対する回答(になっていなければ、すいません) 1.スプリクトにはエラーは表示されていませんが、Unityでテストをすると最初に ``` NullReferenceException: Object reference not set to an instance of an object QuizMgr.Start () (at Assets/QuizMgr.cs:48) ``` のエラーが出ます。 2.JudgeAnswerのコードのSetActiveはテストだけでなく、出来るのであればずっと使いたいです(それ以外の方法を知りませんすいません)。 3.「ボタン」をオフするコードは、上の「ボタン」を非表示にする コードのみです。 Quizというシーンの中にQuizというオブジェクトが入っています。 Buttonは別のシーンで同じ名前はありますが、Quizのシーンではこれだけです。 ButtonはQuizの子になってます。
回答: 恐らく「GameObject.Find(〜)はそのオブジェクトがオフになっていると取得出来ない」という仕様が問題になっていると思います。 (現時点で何故動いているのかよく分かりませんが)根本的な修正を行うならこんな感じかと。 ``` public class QuizMgr : MonoBehaviour { //インスペクタにてドラッグ&ドロップで設定してください。 public GameObject buttonObj; void Start() { //ボタン非表示 buttonObj.SetActive(false); } public void JudgeAnswer() { Text answer = this.GetComponentInChildren(); if (answer.text.IsAny("A", "B", "C")) { //正解の場合 } else { //不正解の場合 } //正解でも不正解でも表示させるならここでいい buttonObj.SetActive(true); } } ``` ちなみに「JudgeAnswerのコードのSetActive、現在両方trueですがこれはテスト用にこうしているという認識でいいですか?」の意図ですが、正解の場合も不正解の場合もtrueだったので「片方falseの間違いかな?(今は動作テストで両方trueにしているのかな?)」と思っただけです。 「次に進むボタン」とのことなので「正解/不正解問わずに表示される」で間違い無さそうなので条件分岐の外にしました。 このままずっと使えるはずなのでご確認ください。